shinobu
shinobu

Reputation: 111

About javascript array

I want to get below result in the end.

[{x: '10', y: '5'}, {x: '8', y: '4'}]

I don't understand why the result get by the following code is

[{x: '8', y: '4'}, {x: '8', y: '4'}]

var test =[["10", "5"],["8","4"]];
var series = {};
var sample = [];
for (var i = 0 ; i < test.length ; i++){
  series.x = test[i][0];
  series.y = test[i][1];
  console.log(i);
  console.log(series);
  sample.push(series);
};
console.log(sample);

Can you give me some advice on what I lack?

Upvotes: 0

Views: 90

Answers (6)

Md Abdullah Mamun
Md Abdullah Mamun

Reputation: 1

You can use spread operator

var test = [["10", "5"], ["8", "4"]];
var series = {};
var sample = [];
for (var i = 0; i < test.length; i++) {
 series.x = test[i][0];
 series.y = test[i][1];
 sample.push({ ...series });
};
console.log(sample);

Upvotes: 0

0stone0
0stone0

Reputation: 43983

The cleanest way is to use map():

var test = [["10", "5"],["8","4"]];
var sample = test.map(([ x, y ]) => ({ x, y }));

console.log(sample);



Regarding your original code, as mentioned, you'll need to create the object inside the loop, so you alter the reference to the first one:

var test =[["10", "5"],["8","4"]];
var sample = [];

for (var i = 0 ; i < test.length ; i++){
  var series = {};
  series.x = test[i][0];
  series.y = test[i][1];
  sample.push(series);
};
console.log(sample);

Upvotes: 0

Abin Thaha
Abin Thaha

Reputation: 4633

By using reduce from ES6 array methods, you can remove most of the codes and replace it with the below code:

var test =[["10", "5"],["8","4"]];
var result = test.reduce((acc, current) => {
    acc.push({x: current[0], y: current[1]});
    return acc;
}, []);
console.log(result);

Let me know if you have any doubts in this ! Happy codiing

Upvotes: 0

ALBERT YOUNG
ALBERT YOUNG

Reputation: 19

Looks like you are pushing the references of the same object (i.e. series) into the array (i.e. sample) twice. That's why the two elements in the results list looks the same. You may want to make a little change (see below) to get what you want.

var test =[["10", "5"],["8","4"]];
var series; /* declare a new variable */
var sample = [];
for (var i = 0 ; i < test.length ; i++){
  series = {};  /* assign a new object */
  series.x = test[i][0];
  series.y = test[i][1];
  console.log(i);
  console.log(series);
  sample.push(series); /* push the reference of the new object for loop i */
};
console.log(sample);

Upvotes: 0

Smokovsky
Smokovsky

Reputation: 562

series is an object, what you have done in the loop basically change the value of members of series twice and push series into sample array twice. Since sample[0] and sample[1] point to the same object, they obviously have the same members, you can verify it with console.log(sample[0] === sample[1]).

Upvotes: 0

Krishna Devashish
Krishna Devashish

Reputation: 86

Hello @shinobu you are doing a simple mistake you are not clearing the object inside object. I am adding a line to the code and it will solve it

var test =[["10", "5"],["8","4"]];
var series = {};
var sample = [];
for (var i = 0 ; i < test.length ; i++){
  series = {};
  series.x = test[i][0];
  series.y = test[i][1];
  sample.push(series);
};
console.log(sample);

Upvotes: 0

Related Questions