我的目标是创建一个这样的数组:
[{"str":"a","number":1},{"str":"a","number":2},{"str":"b","number":1},{"str":"b","number":2}]
所以我写了这个javascript
abc = ["a","b"]
num = [1,2]
arr = []
a = {}
for (var i in abc)
{
str = abc[i]
a.str = str;
for(var x in num)
{
number = num[x]
a.number = number
console.log(a)
arr.push(a)
}
}
控制台日志看起来很好,但是数组看起来像这样:
[{"str":"b","number":2},{"str":"b","number":2},{"str":"b","number":2},{"str":"b","number":2}]
任何人都可以解释一下吗?
答案 0 :(得分:5)
这种情况正在发生,因为您实际上正在处理对同一对象的引用,因此反复修改相同的对象。
要修复它,您必须在每次迭代中声明一个要使用不同对象的新对象。
尝试这样的事情:
var abc = ["a", "b"];
var num = [1, 2];
var arr = [];
for (var i in abc) {
for (var x in num) {
var a = {};
a.str = abc[i];
a.number = num[x];
arr.push(a);
}
}
console.log(arr);
另外,请不要忘记使用var
或let
声明变量,并使用;
结束语句。
答案 1 :(得分:1)
如评论中所述,您已将a
对象多次推送到arr
,而不是添加四个单独的对象。要解决此问题,您可以在a
循环中声明for (var x in num)
,每次都作为新对象(使用const
或let
)。但我进一步简化了它,请参阅下面的代码。
要遍历JavaScript数组,您应该使用.forEach
方法。
let abc = ['a', 'b'];
let num = [1, 2];
let arr = [];
abc.forEach(letter => {
num.forEach(number => {
arr.push({number: number, str: letter});
});
});
答案 2 :(得分:0)
abc = ["a","b"]
num = [1,2]
arr = []
for (var i in abc)
{
for(var x in num)
{
a = {} ---------------- Reset "a"
str = abc[i] --------------------- 1
a.str = str; --------------------- 2
number = num[x]
a.number = number
console.log(a)
arr.push(a)
}
}
console.log(arr)
//在第二个循环中移动1和2
答案 3 :(得分:0)
使用地图:
let tempArray = abc.map((e,i) => { return num.map((ee,ii) => { return {"str": e, "number": ee }; } ) });
$.merge(tempArray[0], tempArray[1]);