Shin-Bang Tsai
Shin-Bang Tsai

Reputation: 1103

Push object into array does not work as expected

My goal is to create an array like this:

[{"str":"a","number":1},{"str":"a","number":2},{"str":"b","number":1},{"str":"b","number":2}]

so I wrote this 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)
        }
    }

the console log looks fine, but the array looks like this:

[{"str":"b","number":2},{"str":"b","number":2},{"str":"b","number":2},{"str":"b","number":2}]

Can anyone could explain this?

Upvotes: 1

Views: 4629

Answers (4)

vanessa
vanessa

Reputation: 451

Using map :

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

Upvotes: 0

pnkz
pnkz

Reputation: 336

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)

// Move 1 and 2 inside the second loop

Upvotes: 0

rafascar
rafascar

Reputation: 343

This is happening because you are actually working with a reference to the same object, thus modifying the same over and over.

To fix it you must declare a new object in every iteration you want to use a different one.

Try something like this:

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

Also, don't forget to declare your variables with var or let and end your statements with ;.

Upvotes: 5

gsc
gsc

Reputation: 1559

As said in the comments, you’ve pushed your a object to arr many times, instead of adding four separate objects. To fix this issue, you could declare a in the for (var x in num) loop, every time as a new object (using const or let). But I’ve simplified it further, see the code below.

To iterate through JavaScript arrays, you should use .forEach method.

let abc = ['a', 'b'];
let num = [1, 2];
let arr = [];

abc.forEach(letter => {
  num.forEach(number => {
    arr.push({number: number, str: letter});
  });
});

Upvotes: 1

Related Questions