通过匹配详细信息在javascript中嵌套对象数组

时间:2015-04-27 10:54:32

标签: javascript jquery

我有一个对象数组,有些对象共享相同的id,是否可以快速嵌套它们以便对它们进行分组,例如:

var items = [
               { id: 5,   title: 'wow',        name: 'item1' },
               { id: 5,   title: 'wow',        name: 'item2' },
               { id: 26,  title: 'latest',     name: 'item3' },
               { id: 26,  title: 'latest',     name: 'item4' }
            ];

要:

 var items = [
               [{ id: 5,   title: 'wow',        name: 'item1' },
                { id: 5,   title: 'wow',        name: 'item2' } ],
               [{ id: 26,  title: 'latest',     name: 'item3' },
                { id: 26,  title: 'latest',     name: 'item4' } ]
            ];

如果您事先没有关于这些对象的任何细节,我可以使用简单的循环,但我正在寻找一个更短,更智能的解决方案,如果有一个,例如:对于每个项目组中的每个id在数组或其他东西下。

3 个答案:

答案 0 :(得分:1)

使用对象临时存储键为id的对象,然后遍历临时对象,将存储的对象添加到输出数组中:

function group(items){
    var temp = {};
    var out = [];
    for (var i = 0, l = items.length; i < l; i++) {
        var id = items[i].id;
        if (!temp[id]) temp[id] = [];
        temp[id].push(items[i]);
    }
    for (var p in temp) {
      out.push(temp[p]);
    }
    return out;
}

DEMO

答案 1 :(得分:1)

你可以试试这个:

function groupBy(array, f) {
    var groups = {};
    array.forEach(function (o) {
        var group = JSON.stringify(f(o));
        groups[group] = groups[group] || [];
        groups[group].push(o);
    });
    return Object.keys(groups).map(function (group) {
        return groups[group];
    })
}

var groupedById = groupBy(items, function (item) {
    return [item.id];
});
console.log(groupedById)

答案 2 :(得分:1)

好的,为了多样性,你有两个好的循环解决方案。这是一个Array.prototype.reduce(虽然使用像这样的减少可能不是那么聪明):

&#13;
&#13;
var items = [
    { id: 5,   title: 'wow',        name: 'item1' },
    { id: 5,   title: 'wow',        name: 'item2' },
    { id: 26,  title: 'latest',     name: 'item3' },
    { id: 26,  title: 'latest',     name: 'item4' }
];

var result = items.reduce(function(prev, curr, index, array) {
    
    if (!prev.cache[curr.id]) {
        prev.data.push(prev.cache[curr.id] = []);
    }
    
    prev.cache[curr.id].push(curr);
    
    return index === array.length - 1 ? prev.data : prev;
    
}, {data: [], cache: {}});
    
document.write('<pre>' + JSON.stringify(result, null, 4) + '</pre>');
&#13;
&#13;
&#13;