javascript - 为什么这个 for 循环添加的嵌套对象比预期更多?

标签 javascript arrays loops for-loop javascript-objects

我在这里回答了一个问题,我想出了如何使用 map() 和展开 (...) 运算符来做到这一点,但我想以更命令式的方式写它。我将向您展示 (1) 我所写的内容,(2) 我期望的结果,然后 (3) 实际结果。

(1) 我写的内容:

    const arrayOfObjects = [
        { var1: 1, var2: 2 },
        { var1: 3, var2: 4 },
        { var1: 5, var2: 6 },
        { var1: 7, var2: 8 }
    ]
    
    const newArray = []
    
    const length = arrayOfObjects.length
    
    for (let i = 0; i < length; i++) {
        if (i < (length - 1)) {
            newArray.push(arrayOfObjects[i])
            newArray[i].child = arrayOfObjects[i+1]
        } else {
            newArray.push(arrayOfObjects[i])
        }
    }
    
    console.log(newArray)

(2) 所以预期结果是这样的:

[ { var1: 1,
    var2: 2,
    child: { var1: 3, var2: 4 } },
  { var1: 3,
    var2: 4,
    child: { var1: 5, var2: 6 } },
  { var1: 5, var2: 6, child: { var1: 7, var2: 8 } },
  { var1: 7, var2: 8 } ]

(3)但是实际结果是这样的:

[ { var1: 1,
    var2: 2,
    child: { var1: 3, var2: 4, child: [Object] } },
  { var1: 3,
    var2: 4,
    child: { var1: 5, var2: 6, child: [Object] } },
  { var1: 5, var2: 6, child: { var1: 7, var2: 8 } },
  { var1: 7, var2: 8 } ]

如果您要检查新数组的第一个索引,console.log(newArray[0])您会看到它一直向下添加了一个子对象:

{ var1: 1,
  var2: 2,
  child: 
   { var1: 3,
     var2: 4,
     child: { var1: 5, var2: 6, child: [Object] } } }

我觉得我错过了一些非常明显的东西,但我一生都无法弄清楚!预先感谢:)

最佳答案

你需要这样做

Object are assigned by reference not by value.so in order to assign value you need to create a copy of it and than assign it.

 newArray[i].child = Object.assign({},arrayOfObjects[i+1])

所以这里Object.assign将创建一个arrayOfObjects.的副本,所以现在当你分配时它将按值分配。

const arrayOfObjects = [
    { var1: 1, var2: 2 },
    { var1: 3, var2: 4 },
    { var1: 5, var2: 6 },
    { var1: 7, var2: 8 }
]

const newArray = []

const length = arrayOfObjects.length

for (let i = 0; i < length; i++) {
    if (i < (length - 1)) {
        newArray.push(arrayOfObjects[i])
        newArray[i].child = Object.assign({},arrayOfObjects[i+1])
    } else {
        newArray.push(arrayOfObjects[i])
    }
}

console.log(newArray)

还有另一种方法可以使用 ... 运算符来完成此操作。

const arrayOfObjects = [
    { var1: 1, var2: 2 },
    { var1: 3, var2: 4 },
    { var1: 5, var2: 6 },
    { var1: 7, var2: 8 }
]

const newArray = []

const length = arrayOfObjects.length

for (let i = 0; i < length; i++) {
    if (i < (length - 1)) {
        newArray.push(arrayOfObjects[i])
        newArray[i].child = {...arrayOfObjects[i]};
    } else {
        newArray.push(arrayOfObjects[i])
    }
}

console.log(newArray)

关于javascript - 为什么这个 for 循环添加的嵌套对象比预期更多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53742559/

相关文章:

php - 循环中的错误数组值

python - 在 Pandas 中循环并应用正则表达式

javascript - 在以下场景中,如何使代码适用于多个文件文件对象?

javascript - 使用 jQuery 选择一个选项?

javascript - 按添加按钮后我的行多次添加

java - 数组总结(工作代码),不抓一行代码

arrays - 在 Matlab 中索引 m 维数组(m 不是常数)

javascript - JavaScript 中的 Promise$2 是什么?

javascript - 用 map 迭代,为什么这不起作用?

Javascript 获取对象的所有属性