How to put items into grouped arrays where grouped by a particular key

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

Answers (3)

Diode
Diode

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

Jonathan Lonowski
Jonathan Lonowski

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

Anoop
Anoop

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

Related Questions