2017-06-02 28 views
0

我的目标是创建一个这样的数组:推对象转换成数组作为预期不起作用

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

任何人都可以解释这一点吗?

+1

这里只有一个涉及对象;您的代码会更新该对象并将其推入阵列中多次。如果您需要不同的对象,则必须在每次迭代时为“a”创建一个新值。另外,用'var'或'let'声明你的变量。 – Pointy

回答

4

发生这种情况是因为您实际上正在使用对同一对象的引用,因此一次又一次地修改相同的对象。

要修复它,你必须在你想使用不同的迭代的每个迭代中声明一个新的对象。

尝试这样:

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

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

要遍历JavaScript数组,您应该使用.forEach方法。

​​3210
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中的第二循环

0

内使用地图:

let tempArray = abc.map((e,i) => { return num.map((ee,ii) => { return {"str": e, "number": ee }; }) }); 
$.merge(tempArray[0], tempArray[1]);