2013-07-29 60 views
4

我有JSON對象的數組像一個新的數組,以便使用jQuery/JavaScript的我在對象的數組組值,以及如何將創建對象的從組

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」和「version」值的列表,如

OLD具有「等級」屬性等於'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" 
} 

Im相當肯定我必須使用$。每次和$ .grep功能,像這樣

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


tsaGrade = dataSet1[index].grade; 

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

並將ID和版本放在新數組中,但是我不知道如何防止每個循環排除下次循環訪問數據集時已分組的值。

+1

新的對象是無效的,如圖所示。 {}對象將鍵映射到值。使用相同的密鑰會覆蓋舊密鑰的數據。也許你想使用包含數組的值{「IDS」:[1,3],「版本」:[4,5],...}對象 – Paul

+0

我不知道你的使用情況,但這個新對象將很難與之合作。如果值不匹配,你需要爲每個屬性創建陣列(見@保羅的評論),你會需要跟蹤indicies的,當您稍後使用該對象。從長遠來看,你的第一種方法可能會更容易。 – cfs

+0

或者這些值可能是維護每個值的計數的對象。就像{「ids」:{「1」:1,「3」:1}}意味着我看過id = 1一次,id = 3一次。 – Paul

回答

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,其值是具有相應等級的對象的列表。然後,您可以遍歷兩個對象列表中的每一個,並將所需的值添加爲您的新對象的列表。難以完全說明,但看​​到這個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 
    } 
}); 

Fiddle

+1

哇,謝謝這正是我想要做的! – user1720275

+0

感謝爲我工作 –

相關問題