如何在JavaScript中正确地将对象从for循环推送到数组?

Jun*_*tae 2 javascript arrays

我想创建一个包含for循环但是有问题的数组,我想要的形状如下:

[ 
  { data: 'apple', label: 'Fruits'  },
  { data: 'banana', label: 'Fruits' },
  { data: 'mango', label: 'Fruits'  } 
]   
Run Code Online (Sandbox Code Playgroud)

所以我尝试了以下方式,但它没有正常工作.

var arr = [];
obj = {};
var fruits = ['banana', 'apple', 'mango'];
var label = 'Fruits';

for (var i=0; i<fruits.length; i++){
    obj['data'] = fruits[i];
    obj['label'] = label;
    arr.push(obj);
}

console.log(arr);
Run Code Online (Sandbox Code Playgroud)

结果就是推送了同样的对象.

[
  { data: 'apple', label: 'Fruits' },
  { data: 'apple', label: 'Fruits' },
  { data: 'apple', label: 'Fruits' } 
]
Run Code Online (Sandbox Code Playgroud)

这是因为功能更接近吗?我怎样才能做得好?

Tus*_*har 11

之所以发生这种情况,是因为obj对象引用了同一个对象,并且每次迭代都会更新.

obj循环内引用相同的对象

在循环内移动对象声明以在每次迭代中创建一个新对象.

for(var i = 0; i < fruits.length; i++) {
    var obj = {}; // <---- Move declaration inside loop

    obj['data'] = fruits[i];
    obj['label'] = label;
    arr.push(obj);
}
Run Code Online (Sandbox Code Playgroud)

var arr = [];
var fruits = ['banana', 'apple', 'mango'];
var label = 'Fruits';

for(var i = 0; i < fruits.length; i++) {
    var obj = {};
    obj['data'] = fruits[i];
    obj['label'] = label;
    arr.push(obj);
}

console.log(arr);
Run Code Online (Sandbox Code Playgroud)


避免这种情况的一种简单方法是使用Array#map从旧版本创建新数组.

var arr = fruits.map(fruit => ({
    data: fruit,
    label: label
}));
Run Code Online (Sandbox Code Playgroud)

var arr = [],
    fruits = ['banana', 'apple', 'mango'],
    label = 'Fruits';

var arr = fruits.map(fruit => ({
    data: fruit,
    label: label
}));
console.log(arr);
Run Code Online (Sandbox Code Playgroud)


isv*_*all 6

您应该在循环内创建新对象obj,您始终引用同一个对象。

var arr = [];
var fruits = ['banana', 'apple', 'mango'];
var label = 'Fruits';

for (var i = 0; i < fruits.length; i++) {
    var obj = {};
    obj['data'] = fruits[i];
    obj['label'] = label;
    arr.push(obj);
}
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 5

你总是覆盖同一个对象。

你需要在 for 行之后

obj = {};
Run Code Online (Sandbox Code Playgroud)

用于创建一个空对象

更短的方法是使用 Array#map()

var arr = [],
    obj,
    fruits = ['banana', 'apple', 'mango'],
    label = 'Fruits',
    i;

for (i = 0; i < fruits.length; i++){
    obj = {}; // <----- new Object

    obj['data'] = fruits[i];
    obj['label'] = label;
    arr.push(obj);
}
 
document.write('<pre>' + JSON.stringify(arr, 0, 4) + '</pre>');
Run Code Online (Sandbox Code Playgroud)