将对象数组添加到单个数组中

3

我正在尝试将一个对象中的对象数组推送到一个新的数组中。但只有最后一个值被推送。

例如:我期望得到输出结果 1 2 3,但实际上得到的是 3 3 3

var arr=[{'id':'1','name':'xyz'},{'id':'2','name':'pqr'},{'id':'3','name':'mon'}];
var toSend=[];
var obj={'id':""};
for(var i=0;i<arr.length;i++) {
    obj.id = arr[i].id;
  toSend.push(obj);
}

Fiddle link

4个回答

2

您将相同的对象引用推送到数组中。通过使用新对象,所有对象都是不同的。

var arr = [{ id: '1', name: 'xyz' }, { id: '2', name: 'pqr' }, { id:'3', name: 'mon' }],
    toSend = [],
    obj;

for (var i = 0; i < arr.length; i++) {
    obj = { id: arr[i].id };
    toSend.push(obj);
}

console.log(toSend);


1

变量obj需要在for循环内声明

同时停止使用var,开始使用let。ES的建议是使用let而不是使用var,因为var具有窗口范围,而let具有块级作用域。

for(let i=0;i<arr.length;i++) {
     let obj= {};
     obj.id = arr[i].id;
     toSend.push(obj);
}

或者您也可以使用map。
 arr.map((data, i) => {
     let obj= {};
     obj.id = data.id;
     toSend.push(obj);
}

如果有语法错误请见谅,因为我是用手机回答的 :)


1

你的代码几乎正确,正如@Nina在她的回答中提到的那样,它需要进行修正。

但是,如果您想要更好的方法来完成此操作,Array#map就是您需要的。以下是它提供的好处:

  1. 它隐式地循环遍历数组。因此,您不需要编写自己的for循环。
  2. 它隐式地返回一个新对象。因此,在循环中不需要声明和使用新对象。
  3. 它提供了更多的函数式方法来完成您想要做的任务。

var arr = [{
  'id': '1',
  'name': 'xyz'
}, {
  'id': '2',
  'name': 'pqr'
}, {
  'id': '3',
  'name': 'mon'
}];

var toSend = arr.map(item => item.id);
console.log(toSend);


1

您也可以使用带有数组解构的Array.map()

var arr=[{'id':'1','name':'xyz'},{'id':'2','name':'pqr'},{'id':'3','name':'mon'}];
var toSend = arr.map(({id}) => ({id}));
console.log(toSend);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接