如何将项目放入按特定键分组的分组数组中

时间:2013-03-20 20:27:46

标签: javascript arrays object

我在JS中的对象中很新,所以我需要一些帮助。我有以下数组:

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 }
];

我需要按给定的属性对信息进行排序。我试过function( array, 'property' )。就我而言,它将是function(persons, 'fname')。我必须使用不同的名称来创建一个Object,并使用该键来存储有关该名称的每个人的信息。例如:

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
}

我实现了这个目标:

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

使用不同的名称作为键创建对象,并将Array作为值。然后我被困住了,不知道接下来该做什么?有人可以提供帮助,如果他有一点时间可以解释一下。

提前致谢。

3 个答案:

答案 0 :(得分:4)

唯一的问题似乎是这一行:

object[persons[i][property]] = [];

它在每次迭代时执行,在添加1个元素之前将每个Array重置为空。在设置之前只需要一个条件:

if (!(persons[i][property] in object))
    object[persons[i][property] = [];

object[persons[i][property].push(persons[i]);

答案 1 :(得分:1)

您应该检查object[persons[i][property]]是否已初始化

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

答案 2 :(得分:0)

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