我想创建一个包含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)
您应该在循环内创建新对象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)
你总是覆盖同一个对象。
你需要在 for 行之后
obj = {};
Run Code Online (Sandbox Code Playgroud)
用于创建一个空对象
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)