为什么此for循环会添加比预期更多的嵌套对象?

时间:2018-12-12 11:59:09

标签: 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] } } }

我觉得我很想念一些东西,但是我一辈子都想不起来!在此先感谢:)

1 个答案:

答案 0 :(得分:1)

您需要这样做

  

对象是通过引用而不是value.so进行分配的,以便进行分配   值,您需要为其创建一个副本并进行分配。

 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)

相关问题