0

私は1時間以上座っています。 遅い時間のせいかもしれませんし、単に愚かかもしれませんが、それはできません。私は2つの配列を持っています

a[0] = [['','',''],['','',''],['','','']];
a[1] = [['','',''],['','',''],['','','']];
a[2] = [['','',''],['','',''],['','','']];
a[3] = [['','',''],['','',''],['','','']];

b=['','','','',
'','','','','',
'','','','','',
'','','','','',
'','','','','',
'','','','','',
'','','','','',
'','']

ご覧のとおり、配列の形式は異なりますが、配列 a[] の各セルは、配列 b[] の兄弟を参照しています。

そのcalculate(3,2,2)のように配列a []のセルのアドレスを取得し、配列b []のセルのアドレスを返す関数を作成しようとしています

ここまで書いてきたのは…

function timecalculating(x,y,z) {
    var count =z;

    var prew=y-1;

    for (var i=k; i>-1; i--) {

        for (var j=vocabulary[i].length; j>-1; j--) {



            count+=vocabulary[i][prew].length;
        }
    }
    alert (count) ;
}

しかし、私はそれが正しくないことを知っています..何か提案はありますか??

以下にいくつかの例を示します。 INPUT (3,1,1) つまり、

a[0] = [['','',''],['','',''],['','','']];
a[1] = [['','',''],['','',''],['','','']];
a[2] = [['','',''],['','',''],['','','']];
a[3] = [['','',''],['','HERE',''],['','','']];

したがって、すべてをカウントダウンする必要があります。(2+3)+(3+3+3)+(3+3+3)+(3+3+3)=32 <= これは配列 b[] の「アドレス」です 2 - z 3(最初の) は a[x][y].length 3(秒) は a[x][y-1].length

等々..

長さの異なる配列に対してユニバーサルにしたい)

a[0] = [['','',''],['','',''],['','','']];
a[1] = [['',''],['','','']];
a[2] = [['','',''],[''],['','']];
a[3] = [['','','']];
4

2 に答える 2

0

正しく理解できているかわかりませんが、これはどういう意味ですか...

function timecalculating(x,y,z) {
    var index = 9 * x + 3 * y + z;
    return b[index];
}

編集

OK、編集した質問を見た後、私はそれをよりよく理解しました。

一般化されたソリューションは驚くほどトリッキーであり、再帰を伴います。

これを試して :

function countUp(arr, stopAt, progress, level) {
    //Initialize level and progress (at level 0).
    level = level || 0;
    if(level == 0) {
        if(!progress) {
            progress = [];
            for(var i=0; i<stopAt.length; i++) progress[i] = 0;
        };
        try {
            var ar = arr, val;
            for(var i=0; i<stopAt.length; i++) {
                val = ar[stopAt[i]];
                if( val == undefined || (i<stopAt.length-1 && !$.isArray(val)) ) {
                    throw('');
                }
                ar = val;
            };
        }
        catch(e) {
            return -1;//return -1 if the requested stopAt position doesn't exist.
        }
    }

    progress[level] = 0;
    var c, stop = false;
    for(var i=0, n=0; i<arr.length; i++, progress[level]++) {
        if($.isArray(arr[i])) {
            c = countUp(arr[i], stopAt, progress, level+1);
            n += c.n;
            stop = c.stop;
        }
        else {
            n += 1;
            stop = arrayCompare(stopAt, progress);
        };
        if(stop) break;
    }
    return (level>0) ? {n:n, 'stop':stop} : n-1;
}

//Utility function for comparing two arrays
function arrayCompare(arr1, arr2) {
    if(arr1.length !== arr2.length) return false;
    for(var i=0; i<arr1.length; i++) {
        if(arr1[i] !== arr2[i]) return false;
    }
    return true;
}

次のように関数を呼び出します。

var index = countUp(a, [3,1,1]);

ここaで、は配列であり、2番目の引数は停止位置のインデックスを表します。

要求された停止位置が存在しない場合、関数は-1を返します。

デモ

于 2013-03-14T22:08:14.880 に答える
0

多次元インデックスを同じサイズの配列の対応する 1 次元インデックスに変換するための一般的な解決策は、配列の最初の次元以外の各次元の次元のサイズを必要とし、行優先または列優先のどちらの順序を使用しているかによって異なります。.

私はあなたが探しているものだと思うので、ここの例では行優先の順序を使用します (列優先に変換するのは簡単です)。次の例を使用して、行優先のインデックス付けについて説明します。次の配列を検討してください。

var array = [[0, 1, 2],
             [0, 1, 2],
             [0, 1, 2]];

行優先順で、あたかも順番に編成されているかのように、行のインデックスを探しています。これは、各行が 1 つの配列に追加されたかのよう[0, 1, 2, 0, 1, 2, 0, 1, 2]です。最初の行のインデックスはまったく同じです (0、1、および 2)。2 行目については、最初の行の長さ (3) を追加する必要があります。これにより、インデックス 3、4、5 が得られます。最初の行の長さは、もちろん、元の配列の 2 番目の次元のサイズです。3 番目の行については、元の配列の 2 番目の次元の 2 倍を追加して、6、7、8 にする必要があります。ここでのパターンは明らかであり、以下の例で使用されています。

c一般に、サイズの2D 配列の場合c[height][width]、2D 位置に対応する 1D インデックスc[y][x]は ですy * width + x

dサイズの 3 次元配列の場合d[depth][height][width]、位置に対応する 1D インデックスd[z][y][x]は ですz * (width * height) + y * width + z

さまざまなサイズの多次元配列にも同じ概念を適用できます。ただし、サブ配列のサイズがわからないため、以前のように 1 回の計算で答えを得ることができません。代わりに、指定されたターゲット インデックスより前の要素の数をカウントする必要があります。以下のコードでわかるように、これは非常に単純で、このデモでテストできます。

/*  Sums the number of elements in each sub-array of the given array.
    Returns the resulting sum.
    array: the array to count the elements of. */
function countAllElements(array) {
    var elements = 0;

    if (Array.isArray(array)) {
        for (var i = 0; i < array.length; ++i) {
            elements += countAllElements(array[i]);
        }
    }
    else {
        ++elements;
    }

    return elements;
}


/*  Sums the number of elements in each sub-array of the given array up to the given target index.
    Returns the resulting sum.
    array: the array to count the elements of.
    target: the target indices as an array, e.g. [3, 1, 5].
    depth: current depth in the nested arrays. Do not call with this. */
function countElementsBeforeIndex(array, target, depth) {
    var elements = 0;

    depth = depth || 0;

    if (Array.isArray(array)) {
        for (var i = 0; i < target[depth]; ++i) {
            elements += countAllElements(array[i]);
        }

        elements += countElementsBeforeIndex(array[target[depth]], target, depth + 1, i);
    }

    return elements;
}

countAllElements配列内のすべての要素を任意のレベルのネストでカウントする関数 と、指定countElementsBeforeIndexされたインデックスに到達するまでカウントする関数 を提供したことがわかります。後者の方法は前者を使用します。

これが役立つことを願っています! (デモ)

于 2013-03-14T22:57:47.483 に答える