将对象推送到数组中无法按预期工作

时间:2017-06-02 11:50:11

标签: javascript jquery

我的目标是创建一个这样的数组:

[{"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}]

任何人都可以解释一下吗?

4 个答案:

答案 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);

另外,请不要忘记使用varlet声明变量,并使用;结束语句。

答案 1 :(得分:1)

如评论中所述,您已将a对象多次推送到arr,而不是添加四个单独的对象。要解决此问题,您可以在a循环中声明for (var x in num),每次都作为新对象(使用constlet)。但我进一步简化了它,请参阅下面的代码。

要遍历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]);