将值附加到多维数组

时间:2009-11-07 13:10:38

标签: javascript algorithm arrays

function append (array, value, dimension) {
  switch (dimension) {
    case 0:
      array.push( value );
      break;
    case 1:
      array[array.length-1].push( value );
      break;
    case 2:
      array[array.length-1][array[array.length-1].length-1].push( value );
      break;
    case 3:
      array[array.length-1][array[array.length-1].length-1][array[array[array.length-1].length-1].length-1].push( value );
      break;
  }
  return array;
}


append([0,1], 9, 0) // [0,1,9]
append([0,[1]], 9, 0) // [0,[1],9]
append([0,[1]], 9, 1) // [0,[1,9]]
append([1,[2,[3,[4]]]], 9, 3) // [1,[2,[3,[4,9]]]]
append([1,[2,[3],2,[4]]], 9, 2) // [1,[2,[3],2,[4,9]]]

此功能仅在尺寸≤3时才有效。此外,它非常难看。这样做的方法是什么?

更新
我知道如何递归地获取数组的最后一个元素:

function get_last(array, dimension) {
  return dimension === 0 ? array[array.length-1] : get_last(array[array.length-1], dimension-1);
}

我需要追加

4 个答案:

答案 0 :(得分:3)

递归算法将遵循这些方针:

Base Case: Append to 0th dimension, Just do it.
Recursive Case: Append to nth dimension where n > 0, Append to n-1 dimension 

在此过程中,您必须确保您的功能所接受的值是合理的。

<强>更新 你可以试试这个:

 function append2(array, value, dimension){
    if(dimension == 0){
       array.push( value );
    }else{
       append(array[array.length-1], value, dimension - 1);
    }

    return array;
  }

这还没有经过详尽的测试,所以要小心。

答案 1 :(得分:2)

尝试这种迭代算法:

function append(array, value, level) {
    var tmp = array;
    while (level > 0) {
        for (var i=tmp.length; i>=0; --i) {
            if (tmp[i] instanceof Array) {
                tmp = tmp[i];
                level--;
                break;
            }
        }
        if (i < 0) {
            break;
        }
    }
    tmp.push(value);
    return array;
}

答案 2 :(得分:2)

Array.prototype.append = function (aElem, aDim) {
  if (aDim > 0) {
    this[this.length - 1].append(aElem, aDim - 1);
  } else {
    this.push(aElem);
  }

  return this;
}

然后

a = [0,[1,2]]; a.append(9, 0) // [0,[1,2],9]
a = [0,[1,2]]; a.append(9, 1) // [0,[1,2,9]]
a = [1,[2,[3,[4]]]]; a.append(9, 3) // [1,[2,[3,[4,9]]]]
...

(在犀牛下测试)

答案 3 :(得分:0)

从我的理解,你总是附加到最后和最深的数组。如果是,则无需明确提供维度

lastArray = function(a) {
  var p = a[a.length - 1];
  return p.push ? lastArray(p) : a;

}

r = [1, 2, [3, [4, 5]]]
lastArray(r).push(9)
console.log(r) // [1, 2, [3, [4, 5, 9]]]