2016-08-01 21 views
1

我在JavaScript中JSON對象的列表如下:重組JSON的具體規則

[{"model":"alpha", "ports":4}, 
{"model":"beta", "ports":4}, 
{"model":"beta", "ports":1}, 
{"model":"beta", "ports":43}, 
{"model":"gamma", "ports":66}, 
{"model":"omega", "ports":6}, 
{"model":"omega", "ports":1}] 

現在我需要找出所有具有相同model值線,然後添加一個include第一項的關鍵,最後使include鍵的值成爲剩餘「相同模型」行的列表。

輸出應該是這樣的:

[{"model":"alpha", "ports":4}, 
{"model":"beta", "ports":4, "include":[ 
{"model":"beta", "ports":1}, 
{"model":"beta", "ports":43}]}, 
{"model":"gamma", "ports":66}, 
{"model":"omega", "ports":6, "include":[ 
{"model":"omega", "ports":1}]}] 

任何人都可以給我如何實現這一個方向?

+0

是否訂購了JSON?如果是這樣,你只需要讀取它並創建包含值,如果前一個與當前模型相同(在循環中) – AxelH

+0

@AxelH是的,現在它是,但我不能保證它總是會因爲它不是由我自己生成的,而是從API返回的。所以我想要一個強大的解決方案。 – wangx1ng

+0

lodash是這樣的東西的一個簡單的選擇。見e,g,https://lodash.com/docs#groupBy – georg

回答

4

爲此,您可以用forEach環和thisArg PARAM

var data = [{"model":"alpha", "ports":4}, 
 
{"model":"beta", "ports":4}, 
 
{"model":"beta", "ports":1}, 
 
{"model":"beta", "ports":43}, 
 
{"model":"gamma", "ports":66}, 
 
{"model":"omega", "ports":6}, 
 
{"model":"omega", "ports":1}]; 
 

 
var result = []; 
 

 
data.forEach(function(e) { 
 
    if(!this[e.model]) { 
 
    this[e.model] = e; 
 
    result.push(this[e.model]); 
 
    } else { 
 
    this[e.model].include = (this[e.model].include || []).concat(e); 
 
    } 
 
}, {}); 
 

 
console.log(result)

+0

你污染模型的窗口,「這」在forEach是窗口 –

+0

@Vladu Ionut忘記添加對象,修復它。 –

+0

這樣一個優雅的方法,不知道javascript的'forEach'是如此強大。它工作得很好,但我仍然需要一些時間檢查一些參考來理解這個美麗的代碼塊。 – wangx1ng

2

您可以使用Array Reduce

var obj =[{"model":"alpha", "ports":4}, 
 
{"model":"beta", "ports":4}, 
 
{"model":"beta", "ports":1}, 
 
{"model":"beta", "ports":43}, 
 
{"model":"gamma", "ports":66}, 
 
{"model":"omega", "ports":6}, 
 
{"model":"omega", "ports":1}]; 
 

 
var res = obj.reduce(function(obj,currentValue){ 
 
    if (obj.length && obj[obj.length-1].model == currentValue.model){ 
 
    obj[obj.length-1].include=obj[obj.length-1].include || []; 
 
    obj[obj.length-1].include.push(currentValue); 
 
    }else{ 
 
    obj.push(currentValue) 
 
    } 
 
    return obj; 
 
},[]); 
 
console.log(res);

0
function processData(data) { 
    return data.reduce(function (result, item) { 
    var first = result.find(function (i) { 
     return i.model === item.model; 
    }); 
    if (!first) { 
     item.include = []; 
     result.push(item); 
    } else { 
     first.include.push(item); 
    } 
    return result; 
    }, []); 
} 

var data = [{"model":"alpha", "ports":4}, 
    {"model":"beta", "ports":4}, 
    {"model":"beta", "ports":1}, 
    {"model":"beta", "ports":43}, 
    {"model":"gamma", "ports":66}, 
    {"model":"omega", "ports":6}, 
    {"model":"omega", "ports":1}]; 

console.log(processData(data)); 
+0

嗯,也許不是軟件中最美麗的部分,但爲什麼downvote,如果它也是一種工作方法..? – ronkot

+0

是的,你肯定不配得上這個,我已經投了你的答案,但由於我聲譽不佳,它現在不會改變任何事情。抱歉。 – wangx1ng