4

我有一个这样的 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"
}];

我想遍历这个数据集并创建一个新的对象数组,这些对象将具有相似“等级”属性的对象合并,并保留它们关联的“id”和“版本”值的列表,如下所示

“等级”属性等于“X”的旧对象

{
"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"
}

“等级”属性等于“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 和版本放在新的数组中,但是我迷失了如何防止每个循环在下一次循环遍历数据集时排除已经分组的值。

4

1 回答 1

2

如果您愿意使用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输入所需的值,以便将它们作为列表添加到您的新对象中。很难完全描述,但请参阅此Fiddle上的日志消息:)

编辑

而不是objs['platform']应该使用objs[0]['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
    }
});

小提琴

于 2013-07-29T20:31:14.637 回答