2016-12-27 24 views
0

我想通過過濾器創建新的唯一JSON表單現有的JSON。通過過濾器創建新的唯一JSON表單現有的JSON

我想下面的JSON:

var newJson = [ 
    {"38:1":["40:89","39:86","40:88"]}, 
    {"38:6":["39:339"]} 
] 

我有以下現有JSON。

var existJson = [ 
    {d: "40:89", t: "38:1"}, 
    {d: "39:86", t: "38:1"}, 
    {d: "40:88", t: "38:1"}, 
    {d: "39:339", t: "38:6"} 
] 

我想創建鉗工,創造新的獨特的JSON像newJson 需要一些過濾器獲得唯一t關鍵和d作爲數組值。

{ t : [d1, d2, d3] } 
+0

這通常稱爲「分組」,通常由稱爲「groupBy」或類似的例程處理。搜索一下,你應該找到很多解決方案。順便說一句,這不是JSON,它只是普通的舊JavaScript。 – 2016-12-27 15:22:39

回答

1

您可以使用Array.prototype.reduce創建hash table並從中獲得新的JSON從它 - 看到演示如下:

var existJson = [ 
 
    {d: "40:89", t: "38:1"}, 
 
    {d: "39:86", t: "38:1"}, 
 
    {d: "40:88", t: "38:1"}, 
 
    {d: "39:339", t: "38:6"} 
 
]; 
 

 
// create a hashtable first 
 
var hash = existJson.reduce(function(p,c){ 
 
    p[c.t] = p[c.t] || []; 
 
    p[c.t].push(c.d); 
 
    return p; 
 
},{}) 
 

 
// now convert into the required array 
 
var result = Object.keys(hash).map(function(e){ 
 
    let el = {}; 
 
    el[e] = hash[e]; 
 
    return el; 
 
}); 
 

 
console.log(result);
.as-console-wrapper{top:0;max-height:100%!important;}

+0

OP希望'newJson'成爲一個對象數組,你的方法返回單個對象 – RomanPerekhrest

+0

@RomanPerekhrest修復它,謝謝! :) – kukkuz

+0

好的,歡迎... – RomanPerekhrest

1

根據您的要求:

我想下面的JSON:

VAR newJson = [{ 「38:1」: 「40:89」, 「39:86」,「40: 88 「]},
{」 38:6 「:[」 39:339" ]}]

使用 Array.forEach()Array.map()功能

簡單的解決方案:

var existJson = [ 
 
    {d: "40:89", t: "38:1"}, 
 
    {d: "39:86", t: "38:1"}, 
 
    {d: "40:88", t: "38:1"}, 
 
    {d: "39:339", t: "38:6"} 
 
], 
 
    newJson = {}; 
 

 
existJson.forEach(function (o) { 
 
    (this[o.t])? this[o.t].push(o.d) : this[o.t] = [o.d]; 
 
}, newJson); 
 

 
newJson = Object.keys(newJson).map(function (k) { 
 
    var o = {}; 
 
    o[k] = newJson[k]; 
 
    return o; 
 
}); 
 
console.log(newJson);