【问题标题】:Javascript: Arrays built during for loop have their order reset [duplicate]Javascript:在for循环期间构建的数组的顺序重置[重复]
【发布时间】:2018-11-29 21:35:58
【问题描述】:

这段代码看起来很简单

let arr = [1,2,3,4,5,6]
let store = [];

for(i = 0; i < arr.length; i++){
  console.log(arr)
  store.push(arr)
  arr.push(arr.shift())
}
console.log('store', JSON.stringify(store))

我期待它回来

[[1,2,3,4,5,6],[2,3,4,5,6,1],[3,4,5,6,1,2],[4,5,6,1,2,3],[5,6,1,2,3,4],[6,1,2,3,4,5]]

但是当循环完成时,它会显示

[[1,2,3,4,5,6],[1,2,3,4,5,6],[1,2,3,4,5,6],[1,2,3,4,5,6],[1,2,3,4,5,6],[1,2,3,4,5,6]]

在控制台中打印值时,它们看起来是正确的,但是当存储变量被记录时,它们都被重新排序。

[1, 2, 3, 4, 5, 6]
[2, 3, 4, 5, 6, 1]
[3, 4, 5, 6, 1, 2]
[4, 5, 6, 1, 2, 3]
[5, 6, 1, 2, 3, 4]
[6, 1, 2, 3, 4, 5]

为什么会这样?

这里有一个类似的问题,但它并没有真正为我的案例提供答案。

Creating a pair of arrays from an array resulting in circular array

【问题讨论】:

  • 你不断改变arr,而store 只包含对同一个数组对象的多个引用。
  • 啊,我明白了,这很有道理。谢谢。

标签: javascript arrays


【解决方案1】:

只需确保您插入的不是对您的数组的相同引用:

let arr = [1,2,3,4,5,6]
let store = [];

for(i = 0; i < arr.length; i++){
  store.push(Array.from(arr))  // <-- Make sure not the same ref
  arr.push(arr.shift())
}
console.log('store', JSON.stringify(store))

【讨论】:

    【解决方案2】:

    store 包含相同的arr 实例 6 次。你每次修改并打印出来,然后把同一个对象添加到store,然后再修改一次。

    要获得您想要的行为,您需要每次都添加一个新实例,例如添加时克隆它。

    【讨论】:

    • 太棒了,谢谢乔治。
    【解决方案3】:

    您可以推送不保留相同对象引用的副本。

    let arr = [1, 2, 3, 4, 5, 6]
    let store = [];
    
    for (i = 0; i < arr.length; i++) {
      store.push(arr.slice())                // just take a copy
      arr.push(arr.shift())
    }
    console.log(store.map(a => a.join(' ')))

    【讨论】:

      【解决方案4】:

      保留原始数组不变并使用splice() 删除开始元素并使用concat() 添加到末尾的替代方法

      let arr = [1,2,3,4,5,6];
      
      let store = arr.map((_,i)=> {
         let a = arr.slice();
         return i ? a.concat(a.splice(0,i)) : a;
      })
      
      console.log(JSON.stringify(store))

      【讨论】:

        【解决方案5】:

        在每个循环中,您都将数组的引用推送到存储

        示例:
        循环 - arr 的引用 - 0x112,然后存储 [ i ] = 对 0x112 的引用

        最后:
        arr - 参考 0x112 - value = [1, 2, 3, 4, 5, 6]

        存储[] = [ref(0x112), ref(0x112), ref(0x112), ref(0x112), ref(0x112), ref(0x112)]

        使用这个:

        let arr = [1,2,3,4,5,6]
        let store = [];
        
        for(i = 0; i < arr.length; i++){
          console.log(arr)
          let newArr = arr.slice();
          store.push(newArr)  
          arr.push(arr.shift())
        }
        console.log('store', JSON.stringify(store))

        【讨论】:

          猜你喜欢
          • 2013-03-07
          • 1970-01-01
          • 2014-10-15
          • 2022-11-15
          • 2023-03-18
          • 1970-01-01
          • 2014-05-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多