【问题标题】:Reverse an array in an array reverses all arrays in the array [duplicate]反转数组中的数组反转数组中的所有数组[重复]
【发布时间】:2016-06-16 13:43:00
【问题描述】:
var alph = ["a", "b", "c"];
var r = [];

for(var i = 0; i < 5; i += 1) {
    r.push(alph);
}

r[0].reverse();
console.log(r); 

/* Output

[ [ 'c', 'b', 'a' ],
  [ 'c', 'b', 'a' ],
  [ 'c', 'b', 'a' ],
  [ 'c', 'b', 'a' ],
  [ 'c', 'b', 'a' ] ]

*/

/* Expected output

[ [ 'c', 'b', 'a' ],
  [ 'a', 'b', 'c' ],
  [ 'a', 'b', 'c' ],
  [ 'a', 'b', 'c' ],
  [ 'a', 'b', 'c' ] ] 

*/

数组中有数组。第一个数组应该颠倒。我以为r[0].reverse() 会这样做,但这个 reverses all 数组。

有人能解释一下为什么会这样吗?

【问题讨论】:

  • 效果未本地化为reverse。你可以做r[0][3] = "d",它同样会一次改变“所有的数组”。它实际上只是一个数组。
  • 对象是 JS 中的引用类型。您需要克隆数组。

标签: javascript arrays reverse


【解决方案1】:

您正在推送数组的引用,因此更新一个将对其余部分进行更改,因为它都是引用单个数组。而是使用 Array#slice 方法推送原始数组的副本以复制数组。

var alph = ["a", "b", "c"];
var r = [];

for (var i = 0; i < 5; i += 1) {
  // push the exact copy of original array
  r.push(alph.slice());
}

r[0].reverse();
console.log(r);

【讨论】:

    【解决方案2】:

    pushr 时,您并没有创建新数组的数组:您将相同的数组推送到 r 5 次(它通过引用而不是值传递)。因此,对r[0] 的任何操作实际上都是在更新alph,这也会导致所有其他引用都被更新。

    【讨论】:

      【解决方案3】:

      实际上,您可以使用@Pranav C Balan 建议的切片方法,但是当数组是多维时,这将失败。您需要像 Array.prototype.clone() 这样的东西来保护功能。让我们去做吧。

      Array.prototype.clone = function(){
        return this.map(e => Array.isArray(e) ? e.clone() : e);
      };
      
      var alph = [ 1, 2, 3, 4, [ 1, 2, [ 1, 2, 3 ], 4 ], 5 ],
        cloned = [],
        sliced = [];
      for(var i = 0; i < 5; i += 1) {
          cloned.push(alph.clone());
          sliced.push(alph.slice());
      }
      
      cloned[0][4][2].reverse(); // only the array at index pos 0,4,2 gets reversed
      sliced[0][4][2].reverse(); // all sub arrays at index 4,2 get reversed
      console.log(JSON.stringify(cloned));
      console.log(JSON.stringify(sliced));

      【讨论】:

        猜你喜欢
        • 2018-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多