【问题标题】:Object value being overwritten in forEach loop在 forEach 循环中被覆盖的对象值
【发布时间】:2018-06-20 12:09:34
【问题描述】:

试图解决这个question 并自己提出另一个问题。

let arr = [
  {"Footprint_Shape":["L-Shape","H-Shape","T-Shape"]},
  {"Num_of_Floors":[1,2]}
]

let answer = [];

arr[0]["Footprint_Shape"].forEach(x => {
  console.log('x: ',x)  //Keeping loop on first array, print the element
  let newObj = {};
  newObj["Footprint_Shape"] = x;

  arr[1]["Num_of_Floors"].forEach(y => {
    console.log('y: ',y)
    newObj["Num_of_Floors"] = y
    answer.push(newObj);
  })
});

console.log(answer);

下面是我所期待的 chrome 日志记录。

但是当我记录答案时,结果如下:

对于arr[1]["Num_of_Floors"] 中的每次迭代,显然我正确打印了y 值并立即构造对象并推入数组,但似乎值1 总是被覆盖

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    您没有在第二个循环中创建新对象。您只是在第一个循环中创建的第二个循环中更改 newObj 的值。

    你可以这样做:

    let arr = [{"Footprint_Shape": ["L-Shape", "H-Shape", "T-Shape"]},{"Num_of_Floors": [1, 2]}];
    
    let answer = [];
    arr[0]["Footprint_Shape"].forEach(x => {
      arr[1]["Num_of_Floors"].forEach(y => {
        let newObj = {};                      //You have to initate the object inside to create a new object every loop.
        newObj["Footprint_Shape"] = x;
        newObj["Num_of_Floors"] = y
        answer.push(newObj);
      });
    });
    
    console.log(answer);

    或者你可以同时创建对象和推送:

    let arr = [{"Footprint_Shape": ["L-Shape", "H-Shape", "T-Shape"]},{"Num_of_Floors": [1, 2]}];
    
    let answer = [];
    arr[0]["Footprint_Shape"].forEach(x => {
      arr[1]["Num_of_Floors"].forEach(y => {
        answer.push({Footprint_Shape: x, Num_of_Floors: y});   //Create and push
      });
    });
    
    console.log(answer);

    【讨论】:

      【解决方案2】:

      在这里,您总是覆盖以前的值:

      arr[1]["Num_of_Floors"].forEach(y => newObj["Num_of_Floors"] = y
      

      所以newObj["Num_of_Floors"] 将永远等于循环结束后数组中的最后一层。听起来您想在每次迭代时制作并推送一个对象:

      let arr = [
        {"Footprint_Shape":["L-Shape","H-Shape","T-Shape"]},
        {"Num_of_Floors":[1,2]}
      ]
      let answer = [];
      
      arr[0]["Footprint_Shape"].forEach(Footprint_Shape => {
        arr[1]["Num_of_Floors"].forEach(Num_of_Floors => {
          answer.push({
            Footprint_Shape,
            Num_of_Floors,
          });
        })
      });
      
      console.log(answer);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-17
        • 2021-03-28
        • 2018-04-22
        • 1970-01-01
        • 2022-01-13
        • 2013-07-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多