2016-08-01 6 views
1

ich eine Liste von JSON-Objekte in Javascript, haben wie folgt aussieht:Restructuring JSON mit JavaScript durch spezifische Regeln

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

Jetzt muss ich alle Linien herauszufinden, welche die gleiche model Wert haben, dann fügen Sie ein include Schlüssel zum ersten Element, in dem schließlich der Wert des include Schlüssels eine Liste der übrigen "gleichen Modell" -Linien sein soll.

Ausgabe sollte wie folgt sein:

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

Wer mir eine Richtung, wie dies zu erreichen geben könnte?

+0

Ist JSON bestellt? Wenn ja, müssen Sie es nur lesen und die Include-Werte erstellen, wenn das vorherige als das gleiche Modell wie das aktuelle (in der Schleife) – AxelH

+0

@AxelH Ja, für jetzt ist es, aber ich kann nicht garantieren, dass es immer sein wird geordnet, weil es nicht selbst generiert wird, sondern von einer API zurückgegeben wird. Also ich möchte eine robuste Lösung. – wangx1ng

+0

lodash ist eine einfache Option für solche Sachen. Siehe e, g, https://lodash.com/docs#groupBy – georg

Antwort

4

Sie können dies tun, mit forEach Schleife und 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

verschmutzen Sie das Fenster mit den Modellen, "dies" in Ihrem forEach ist Fenster –

+0

@Vladu Ionut Forgot Objekt hinzufügen, repariert es. –

+0

so ein eleganter Ansatz, wusste nicht, Javascript 'forEach' ist so mächtig. Es funktioniert wirklich gut, aber ich brauche noch einige Zeit, einige Referenzen zu überprüfen, um diesen schönen Codeblock zu verstehen. – wangx1ng

2

Sie Array Reduce

können

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

Nun, vielleicht nicht der schönste Teil der Software, aber warum, wenn es auch ein Arbeitsansatz ist. – ronkot

+0

Ja, Mann, du verdienst es sicher nicht, ich habe deine Antwort gewählt, aber es wird in diesem Moment wegen meines schlechten Rufes nichts ändern. Es tut uns leid. – wangx1ng