1

JavaScript で多次元配列の要素を選択する方法はありますか。深さ/ランク/次元は可変であり、キーはインデックスの配列によって与えられます。そのため、考えられるすべての次元の深さを個別に処理することはできません。具体的に言えば、次のようなスイッチケースを取り除きたいです:

/**
 * set tensor value by index
 * @type {array} indices [ index1, index2, index3 ] -> length == rank.
 * @type {string} value.
 */
tensor.prototype.setValueByIndex = function( indices, value ) {
    var rank = indices.length;

    switch(rank) {
        case 0:
            this.values[0] = value;
        break;
        case 1:
            this.values[indices[0]] = value;
        break;
        case 2:
            this.values[indices[0]][indices[1]] = value;
        break;
        case 3:
            this.values[indices[0]][indices[1]][indices[2]] = value;
        break;
    }
}

this.valuesは多次元配列です

次のようなものが得られるように:

/**
 * set tensor value by index
 * @type {array} indices, [ index1, index2, index3 ] -> length == rank
 * @type {string} value
 */
tensor.prototype.setValueByIndex = function( indices, value ) {
    var rank = indices.length;

    this.values[ indices ] = value;
}

前もって感謝します!

4

4 に答える 4

2
tensor.prototype.setValueByIndex = function( indices, value ) {
    var array = this.values;
    for (var i = 0; i < indices.length - 1; ++i) {
        array = array[indices[i]];
    }
    array[indices[i]] = value;
}

これはarray、現在のネストされた配列を指すために使用され、現在の から次の値indiciesを見つけるためにを読み取ります。リストの最後のインデックスに到達すると、値を格納する配列が見つかりました。最後のインデックスは、値を格納する最後の配列内のスロットです。arrayarrayindices

于 2012-06-13T16:51:23.587 に答える
1

このような?

tensor.prototype.setValueByIndex = function( indices, value ) {
  var t = this, i;
  for (i = 0; i < indices.length - 1; i++) t = t[indices[i]];
  t[indices[i]] = value;
}
于 2012-06-13T16:30:18.933 に答える
1

このようなもの:

tensor.prototype.setValueByIndex = function( indexes, value ) {
    var ref = this.values;  
    if (!indexes.length) indexes = [0];  
    for (var i = 0; i<indexes.length;i++) {
       if (typeof ref[i] === 'undefined') ref[i] = [];
       if (ref[i] instanceof Array) {  
           ref = ref[i];
       } else {
           throw Error('There is already value stored') 
       }
    } 
    ref = value;
}
于 2012-06-13T16:43:21.197 に答える
1

なぜそれをしたいのですか?私は書くと言うでしょう

tensor.values[1][5][8][2] = value;

よりもはるかに明確です

tensor.setValues([1, 5, 8, 2], value);

本当にそれを行う必要がある場合は、配列に対する単純なループになります。

tensor.prototype.setValueByIndex = function(indices, value) {
    var arr = this.values;
    for (var i=0; i<indices.length-1 && arr; i++)
        arr = arr[indices[i]];
    if (arr)
        arr[indices[i]] = value;
    else
        throw new Error("Tensor.setValueByIndex: Some index pointed to a nonexisting array");
};
于 2012-06-13T16:56:13.197 に答える