Reputation: 111
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
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
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
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
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
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
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