繁体   English   中英

如何使用JQuery / JavaScript将对象数组中的值分组并从这些组中创建新的对象数组

[英]Using JQuery/JavaScript how would I group values in an array of objects and create a new array of objects from the groups

我有一个像这样的JSON对象数组

var dataSet1 = [{
"id": "1",
    "engine": "Trident",
    "browser": "Internet Explorer 4.0",
    "platform": "Win 95+",
    "version": "5",
    "grade": "X"
}, {
"id": "2",
    "engine": "Trident",
    "browser": "Internet Explorer 4.0",
    "platform": "Win 95+",
    "version": "5",
    "grade": "A"
}, {
"id": "3",
    "engine": "Trident",
    "browser": "Internet Explorer 4.0",
    "platform": "Win 95+",
    "version": "4",
    "grade": "X"
},
{
"id": "4",
    "engine": "Trident",
    "browser": "Internet Explorer 4.0",
    "platform": "Win 95+",
    "version": "5",
    "grade": "A"
}];

我想遍历该数据集并创建一个新的对象数组,该对象将具有类似“ grade”属性的对象合并,并保留其相关的“ id”和“ version”值的列表,如下所示

具有“ grade”属性等于“ X”的OLD对象

{
"id": "1",
    "engine": "Trident",
    "browser": "Internet Explorer 4.0",
    "platform": "Win 95+",
    "version": "5",
    "grade": "X"
} 
{
"id": "3",
    "engine": "Trident",
    "browser": "Internet Explorer 4.0",
    "platform": "Win 95+",
    "version": "4",
    "grade": "X"
}

NEW具有“ grade”属性等于“ X”的对象

{
"ids":{"id":"1","id":"3"}
    "engine": "Trident",
    "browser": "Internet Explorer 4.0",
    "platform": "Win 95+",
    "versions":{ "version":"4", "version":"5"}
    "grade": "X"
}

我很确定我必须像这样使用$ .each和$ .grep函数

    $.each(dataSet1, function (index, value) {


tsaGrade = dataSet1[index].grade;

result = $.grep(dataSet1, function (e) {
    return e.grade == tsaGrade;
})

并将ID和版本放置在新数组中,但是我迷失了如何防止每个循环排除下次循环遍历数据集时已经分组的值。

如果您愿意使用Underscore.js ,这将变得非常简单。

假设data是您的json对象的原始列表,这将实现您所追求的目标:

var groups = [];
var by_grade = _.groupBy(data, function(obj) { return obj['grade'] });
_.each(by_grade, function(objs, grade) {
    var group = {};
    group['grade'] = grade;
    group['ids'] = _.pluck(objs, 'id');
    group['versions'] = _.pluck(objs, 'version');
    // Use the following if the value is known to be 
    // the same for all grouped objects
    group['platform'] = objs[0]['platform'];
    // And the rest...
    groups.push(group);
});

_.groupBy()将按等级对您的对象进行分组,从而产生两个具有键XA的对象,其值是具有相应等级的对象的列表。 然后,您可以循环每个对象的两个列表, pluck荷兰国际集团所需要的值,以便它们将被添加为清单到您的新对象。 难以完整描述,但请参阅此提琴上的日志消息:)

编辑

应当使用objs[0]['platform']代替objs['platform'] ,因为您所知道的所有相同等级的属性都相同。

编辑2

基于此构建,一个更好的方法而不是_.each可能是_.map

groups = _.map(by_grade, function(objs, grade) {
    return {
        grade: grade, 
        browsers: _.pluck(objs, 'browser'),
        ids: _.pluck(objs, 'id'),
        versions: _.pluck(objs, 'id'),
        engines: _.pluck(objs, 'engine')
        // etc
    }
});

小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM