2015-12-21 47 views
0

從我的服務器其餘API值的鍵控陣列,我要求具有以下結構的javascript對象:拼合嵌套JSON成使用下劃線

[ 
    { 
    "msgID": 3, 
    "admTag": { 
     "tagName": "Employee" 
    } 
    }, 
    { 
    "msgID": 3, 
    "admTag": { 
     "tagName": "Safety" 
    } 
    }, 
    { 
    "msgID": 3, 
    "admTag": { 
     "tagName": "Performance" 
    } 
    }, 
    { 
    "msgID": 7, 
    "admTag": { 
     "tagName": "Role Based Training" 
    } 
    }, 
    { 
    "msgID": 7, 
    "admTag": { 
     "tagName": "Account Service Information" 
    } 
    }, 
    { 
    "msgID": 6, 
    "admTag": { 
     "tagName": "Consumer Product Safety Improvement" 
    } 
    } 
] 

在客戶端上使用該對象,我需要改造該結構按msgID屬性進行分組,併爲其分配一個包含關聯的tagName的值的數組。像這樣:

[{ 
    "3": ["Employee","Safety","Performance"], 
    "7": ["Role Based Training","Account Service Information"], 
    "6": ["Consumer Product Safety Improvement"] 
}] 

我可以做到這一點使用嵌套的for循環,但我知道這是可以更有效地完成,並用下劃線更少的代碼。使用GROUPBY,我能夠得到的MSGID的分組,給了我,我需要的按鍵:

_.groupBy(tags.tags, function(model){ 
    return model.msgID; 
}); 

...但我不能確定如何「拔毛」從得到的對象的標記名,並將它們分配給正確的msgID。

非常感謝您的幫助!

回答

0

使用.groupBy.mapValues_.map你可以做這樣的事情:

var output = _(input) 
    .groupBy('msgID')       // Group by msgId 
    .mapValues(function(group) {    // Transform value of each group 
    return _.map(group, 'admTag.tagName'); // Return array of tagNames 
    }) 
    .value(); 

jsFiddle

1

一個在純Javascript中的解決方案。只需四行代碼。

var array = [{ "msgID": 3, "admTag": { "tagName": "Employee" } }, { "msgID": 3, "admTag": { "tagName": "Safety" } }, { "msgID": 3, "admTag": { "tagName": "Performance" } }, { "msgID": 7, "admTag": { "tagName": "Role Based Training" } }, { "msgID": 7, "admTag": { "tagName": "Account Service Information" } }, { "msgID": 6, "admTag": { "tagName": "Consumer Product Safety Improvement" } }], 
 
    result = {}; 
 

 
array.forEach(function (a) { 
 
    result[a.msgID] = result[a.msgID] || []; 
 
    result[a.msgID].push(a.admTag.tagName); 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

0

使用_.reduce從下劃線

var result = _.reduce(tags.tags, function(l, r) { 
    if (typeof l[r.msgID] === "undefined") { 
     l[r.msgID] = []; 
    } 
    l[r.msgID].push(r.admTag.tagName); 
    return l; 
}, {}); 

fiddle

這也可以用本機Array.prototype.reduce可以實現幾乎相同的代碼

var result = tags.tags.reduce(function(l, r) { 
    if (typeof l[r.msgID] === "undefined") { 
     l[r.msgID] = []; 
    } 
    l[r.msgID].push(r.admTag.tagName); 
    return l; 
}, {}); 

fiddle