Reputation: 6607
I am pretty new in Objects in JS, so I will need some help. I have the following Array:
var persons = [
{ fname : 'Steven', lname : 'Jameson', age : 20 },
{ fname : 'George', lname : 'Thrump', age : 40 },
{ fname : 'Peter', lname : 'Jacobs', age : 60 },
{ fname : 'Peter', lname : 'Thrump', age : 20 },
{ fname : 'Steven', lname : 'Henderson', age : 40 },
{ fname : 'John', lname : 'Jacobs', age : 30 },
{ fname : 'Steven', lname : 'Thrump', age : 50 },
{ fname : 'George', lname : 'Peterson', age : 40 },
{ fname : 'Peter', lname : 'Jameson', age : 60 }
];
I need to sort the information by a given property. I've tried with function( array, 'property' )
. In my case it will be function(persons, 'fname')
. I have to achieve an Object with keys the different names and that keys to store the information about everyone with that name. For example:
Object {
Steven : everyone with first name Steven,
George : everyone with first name George,
Peter : everyone with first name Peter,
John : everyone with first name John
}
I achieve this:
function group( array, property ) {
var object = {};
for (var i = 0; i < persons.length; i++) {
object[persons[i][property]] = [];
object[persons[i][property]].push(persons[i])
};
};
Creating the object with the different names as keys, and giving them Array as value. And then I am stuck and don't know what to do next ? Can someone help and if he has few minutes to explain a bit.
Thanks in advance.
Upvotes: 1
Views: 112
Reputation: 25145
function group(array, property) {
var object = {};
for (var i = 0; i < array.length; i++) {
var person = array[i];
if (person[property]) {
object[person[property]] = object[person[property]] || [];
object[person[property]].push(person);
}
};
return object;
};
group(persons, "fname");
Upvotes: 0
Reputation: 123493
The only issue seems to be with this line:
object[persons[i][property]] = [];
It executes for every iteration, resetting each Array
back to empty before adding 1 element. It just needs a condition before setting:
if (!(persons[i][property] in object))
object[persons[i][property] = [];
object[persons[i][property].push(persons[i]);
Upvotes: 4
Reputation: 23208
You should check if object[persons[i][property]]
is already initialize
function group( persons, property ) {
var object = {};
for (var i = 0; i < persons.length; i++) {
if(!object[persons[i][property]]) {
object[persons[i][property]] = [];
}
object[persons[i][property]].push(persons[i])
};
return object;
};
Upvotes: 1