对象始终获取 forEach 循环中的最后一个值 - JavaScript

尝试根据的array2值过滤结果,但结果数组始终打印 forEach 循环中的最后一个值。typearray1


片段


const array1 = [{

    name: "Audi",

    type: "sedan"

  },

  {

    name: "BMW",

    type: "sedan"

  },

  {

    name: "Benz",

    type: "suv"

  }

];

const array2 = [{

  year: "2020"

}, {

  year: "2021"

}];


let a = [];

let customObject1 = {};

let array3 = [];

array1.forEach((val1) => {

  array2.forEach((val2) => {

    if (val1.type === "sedan") {

      customObject1["label"] = "Sedan Car";

      customObject1["year"] = val2.year;

      array3.push(customObject1);

      console.log(array3);

    }

  });

});

这是我期待的结果。有人可以帮忙吗?

array3 = [{label: 'Sedan Car', year: '2020'}, {label: 'Sedan Car', year: '2021'}]


慕姐4208626
浏览 306回答 4
4回答

呼唤远方

当您推送到 array3 时,您需要在每个循环中克隆 customObject1,您可以使用 JSON.stringify() 然后 JSON.parse() 来获取该对象的副本(在内存中具有新的引用),否则您将覆盖每个循环引用同一对象。let a = [];let customObject1 = {};let array3 = [];array1.forEach((val1) => {  array2.forEach((val2) => {    if (val1.type === "sedan") {      customObject1["label"] = "Sedan Car";      customObject1["year"] = val2.year;      array3.push(JSON.parse(JSON.stringify(customObject1)));      console.log(array3);    }  });});

MYYA

customObject1您只能获得最后一个值,因为您为每个元素重复使用相同的实例array3。customObject1通过为每个元素定义一个新实例,您将获得更好的结果:const array1 = [{    name: "Audi",    type: "sedan"  },  {    name: "BMW",    type: "sedan"  },  {    name: "Benz",    type: "suv"  }];const array2 = [{  year: "2020"}, {  year: "2021"}];let a = [];let array3 = [];array1.forEach((val1) => {  array2.forEach((val2) => {    if (val1.type === "sedan") {      let customObject1 = {};      customObject1["label"] = "Sedan Car";      customObject1["year"] = val2.year;      array3.push(customObject1);      console.log(array3);    }  });});

墨色风雨

问题是,在内部 forEach 循环的每次迭代期间都使用相同的 customObject 引用。我更喜欢一种完全不使用变量的解决方案,直接将对象作为参数传递到推送函数中。let a = [];let array3 = [];array1.forEach((val1) => {  array2.forEach((val2) => {    if (val1.type === "sedan") {      array3.push({ label: "Sedan Car", year: val2.year });    }  });});如果您想保留变量,您还可以利用对象解构来创建副本let a = [];let customObject1 = {};let array3 = [];array1.forEach((val1) => {  array2.forEach((val2) => {    if (val1.type === "sedan") {      customObject1["label"] = "Sedan Car";      customObject1["year"] = val2.year;      array3.push({...customObject1}) //destructuring the object;      console.log(array3);    }  });});

慕工程0101907

我知道你想在这里做什么。但您可以这样做。const array1 = [  {    name: 'Audi',    type: 'sedan',  },  {    name: 'BMW',    type: 'sedan',  },  {    name: 'Benz',    type: 'suv',  },];const array2 = [  {    year: '2020',  },  {    year: '2021',  },];const array3 = [];array2.forEach((item, index) => {  array1.forEach((item2) => {    if (item2.type === 'sedan') {      item.label = 'Sedan Car';    }  });  array3.push(item);});console.log(array3);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript