【问题标题】:Array.push not working within for loop within forEach loop.JavascriptArray.push 在 forEach 循环中的 for 循环中不起作用。Javascript
【发布时间】:2020-05-04 08:37:18
【问题描述】:

我一直在尝试将一个包含 3 个值的数组推送到一个数组以创建一个 AOA。但是我的预期输出不正确。

输入数据如下所示

[
{id:xxxxx,
date:VALUE,
date:VALUE,
..months worth
},
{id:xxxx2,
date:VALUE,
date:VALUE,
..months worth
},
..loads of entries
]

请看下面的代码片段。

arrayOfObjects.forEach(e =>{            
            let entry = [];
            entry[0] = e.id;            
            let PC = Object.values(e)        
            let Dates = Object.keys(e)
            PC.shift();
            Dates.shift();
            for(let i = 0; i <PC.length; i++){
                if(PC[i] === 'No Data'){
                    entry[2] = 0;
                    entry[1] = Dates[i];                   
                } else {
                    entry[2] = PC[i];
                    entry[1] = Dates[i];
                }
                finalArray.push(entry);
            }

        })

我得到一个包含静态日期的输出数组

[
  ...
  [ 'NAAAAD', '10/31/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  ...
]

当我想查看日期增量时。

[
  ...
  [ 'NAAAAD', '10/25/19', 0 ],
  [ 'NAAAAD', '10/26/19', 0 ],
  [ 'NAAAAD', '10/27/19', 0 ],
  [ 'NAAAAD', '10/28/19', 0 ],
  [ 'NAAAAD', '10/29/19', 0 ],
  [ 'NAAAAD', '10/30/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  ...
]

我有console.log(entry),就在它被推入数组之前,我当时包含正确的信息?我已将 finalArray.push(entry) 移动到 if 语句中,直接位于输入正确的行下方。

这里发生了什么?我找不到这样的东西,我已经考虑过变量的范围,但它们似乎都是正确的。

谢谢

瑞恩

【问题讨论】:

  • 您一直在将对同一 entry 对象的引用推送到您的数组中。您每次都需要创建一个 new 对象。
  • @04FS 你好,我已经放弃了entry 的值,然后才将它推入数组?所以应该包含新数据?
  • @Peachman1997 不,你没有,它仍然是同一个对象。您已经为该对象的属性分配了新值,但您推送的对象仍然是相同的;您推送的所有条目都指向同一个对象及其最新属性。
  • @Thomas 这对我来说没有意义......我更改了数组的属性并将带有新条目的数组推送到 finalArray 中。它同名的对象,但更新的值不更新?
  • @Peachman1997 不,我希望看到让我们在列表中说出您的名字(或其他可以识别您身份的其他名称)两次,并且一旦我“解决”了那个名字背后的人,我会见到你。但是,您现在可能看起来。不是版本 1 中的你 vs 版本 2 中的你,……你,我看着你那一刻的你;无论在此之前或之后您可以更改多少次。

标签: javascript arrays loops push


【解决方案1】:

我认为您可能需要在每次推送之前克隆对象:

arrayOfObjects.forEach(e =>{            
        let entry = [];
        entry[0] = e.id;            
        let PC = Object.values(e)        
        let Dates = Object.keys(e)
        PC.shift();
        Dates.shift();
        for(let i = 0; i <PC.length; i++){
            let newEntry = Object.assign([], entry);
            if(PC[i] === 'No Data'){
                newEntry[2] = 0;
                newEntry[1] = Dates[i];                   
            } else {
                newEntry[2] = PC[i];
                newEntry[1] = Dates[i];
            }
            finalArray.push(newEntry);
        }

    })

【讨论】:

  • 之所以有效,是因为每次您将entry 推送到数组上时,您都在推送同一个数组,而每次您执行entry[2] = 0; entry[1] = Dates[i] 时,您只是在更改同一数组的值。另一方面,let newEntry = Object.assign([], entry); 会复制条目并将其推送。
【解决方案2】:

除了这种复杂的方法,为什么不为要添加到列表中的每个新的不同行创建一个新的、不同的条目。

arrayOfObjects.forEach(e => {
  for (let [key, value] of Object.entries(e)) {
    if (value === 'No Data') {
      value = 0; // change the variable `value`
    }
    // push a new row
    finalArray.push([ e.id, key, value ]);
  }
})

arrayOfObjects.forEach(e => {
  for (let [key, value] of Object.entries(e)) {
    finalArray.push([ e.id, key, value === 'No Data' ? 0 : value ]);
  }
})

【讨论】:

  • 是的,我最终尝试了这种方法来确认我的理解,喜欢第二个代码片段,非常干净整洁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多