【问题标题】:Why is this for loop adding more nested objects than anticipated?为什么这个 for 循环添加的嵌套对象比预期的要多?
【发布时间】:2019-05-13 12:44:19
【问题描述】:

我在这里回答了一个问题,我想出了如何使用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] } } }

我觉得我遗漏了一些非常明显的东西,但我终其一生都无法弄清楚!在此先感谢:)

【问题讨论】:

  • 这是因为newArray[i].child = arrayOfObjects[i+1] 通过引用分配。您需要创建一个新对象并分配它。如果您通过引用分配,当您更改 newArray 值时,arrayOfObjects 值也会更改并包含子元素。
  • 谢谢你的解释:)

标签: javascript arrays loops for-loop javascript-objects


【解决方案1】:

您需要这样做

对象是通过引用而不是通过值分配的。所以为了分配 您需要创建一个副本然后分配它。

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

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

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)

【讨论】:

  • 谢谢!这解释了很多。
  • @JossClassey 如果有帮助,您可以将其标记为正确的:p 无论如何很乐意提供帮助 :)
猜你喜欢
  • 1970-01-01
  • 2018-10-16
  • 2019-04-11
  • 2021-10-10
  • 2023-03-28
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多