2017-12-21 1 views
6

Ich muss JSON-Objekte mit demselben Schlüssel in einen zusammenführen, damit ein Objekt oder Array (egal ob Ergebnis ein Objekt oder Array) den Schlüssel und ein Array enthält die WerteZusammenführen von JSON-Objekten mit demselben Schlüssel

Beispiel JSON-Objekt:

[{ 
    "meine_frage": "hier kommt die antwort", 
    "ne_andere_frage": "ne andere antwort", 
    "was_willst_du": "alles", 
    "mehr_zur_auswahl": ["einiges", "vieles und", "g\u00e4r nix"] 

}, { 
    "meine_frage": "tom & jerry", 
    "ne_andere_frage": "mickey maus", 
    "was_willst_du": "oder", 
    "mehr_zur_auswahl": ["manches", "einiges", "vieles und", "g\u00e4r nix"] 

}, { 
    "meine_frage": "dick und doof", 
    "ne_andere_frage": "minnie muas", 
    "was_willst_du": "nichts", 
    "mehr_zur_auswahl": ["g\u00e4r nix"] 

}] 

Ergebnis sollte wie folgt aussehen:

[{ 
    "meine_frage": ["hier kommt die antwort", "tom & jerry", "dick und doof"], 
    "ne_andere_frage": ["ne andere antwort", "mickey maus", "minnie muas"], 
    "was_willst_du": ["alles", "oder"], 
    "mehr_zur_auswahl": ["einiges", "vieles und", "g\u00e4r nix", "manches", "einiges", "vieles und", "g\u00e4r nix"] 
}] 

einige Werte bereits Arrays, während andere nicht, werden die Schlüssel dynamisch so annehmen t genterated er ist der Schlüsselname ist unkown

ich versuchte Iterieren über den Schlüssel/Wert mit $ .each und for-Schleifen, aber ohne Erfolg, auch im Internet gesucht, aber konnte nicht ähnlich finden, jede Hilfe dankbar

+5

wo ist dein js Code? – madalinivascu

+0

danke Ihnen allen für Ihre schnelle Antworten – prince

Antwort

6

Sie können für diese reduce() und concat() Methoden.

const data = [{"meine_frage":"hier kommt die antwort","ne_andere_frage":"ne andere antwort","was_willst_du":"alles","mehr_zur_auswahl":["einiges","vieles und","gär nix"]},{"meine_frage":"tom & jerry","ne_andere_frage":"mickey maus","was_willst_du":"oder","mehr_zur_auswahl":["manches","einiges","vieles und","gär nix"]},{"meine_frage":"dick und doof","ne_andere_frage":"minnie muas","was_willst_du":"nichts","mehr_zur_auswahl":["gär nix"]}] 
 

 
const result = data.reduce(function(r, e) { 
 
    return Object.keys(e).forEach(function(k) { 
 
    if(!r[k]) r[k] = [].concat(e[k]) 
 
    else r[k] = r[k].concat(e[k]) 
 
    }), r 
 
}, {}) 
 

 
console.log(result)

+0

kurz und effektiv danke – prince

+0

Gern geschehen. –

+0

Das ist gut und ziemlich nah dran, funktional zu sein. Mit ein paar Optimierungen könnten Sie es so machen: Ersetzen Sie das if/else und die Zuweisungen durch eine ternäre return-Anweisung und verwenden Sie diese Funktion in [array_map_associative] (https://stackoverflow.com/a/43004994/760706). –

5

Sie könnten reduce verwenden Methode durch Übergabe einer callback Funktion als Parameter.

Der Algorithmus ist wie folgt vor: wenn letzte Objekt bereits enthält ein Schlüssel, dann sollten Sie der Schlüssel des Wert mit einem leeren Array initialisieren. Andernfalls sollten Sie an Array-Wert von allen Elementen aus dem Array anhängen.

let data = [{"meine_frage":"hier kommt die antwort","ne_andere_frage":"ne andere antwort","was_willst_du":"alles","mehr_zur_auswahl":["einiges","vieles und","gär nix"]},{"meine_frage":"tom & jerry","ne_andere_frage":"mickey maus","was_willst_du":"oder","mehr_zur_auswahl":["manches","einiges","vieles und","gär nix"]},{"meine_frage":"dick und doof","ne_andere_frage":"minnie muas","was_willst_du":"nichts","mehr_zur_auswahl":["gär nix"]}] 
 

 
let result = data.reduce(function(obj, item){ 
 
    Object.keys(item).forEach(function(key){ 
 
    if(!obj[key]) obj[key] = [].concat(item[key]) 
 
    else { 
 
     if(Array.isArray(item[key])) 
 
     obj[key].push(...item[key]) 
 
     else 
 
     obj[key].push(item[key]); 
 
    } 
 
    }); 
 
    return obj; 
 
},{}); 
 
console.log([result]);

+0

danke das funktioniert auch gut – prince

2

Verwenden map und überprüfen, indem Array.isArray, versuchen Sie unter Code

var myArray = [{"meine_frage": "hier kommt die antwort","ne_andere_frage": "ne andere antwort","was_willst_du": "alles","mehr_zur_auswahl": ["einiges", "vieles und", "g\u00e4r nix"]}, {"meine_frage": "tom & jerry","ne_andere_frage": "mickey maus","was_willst_du": "oder","mehr_zur_auswahl": ["manches", "einiges", "vieles und", "g\u00e4r nix"]}, {"meine_frage": "dick und doof","ne_andere_frage": "minnie muas","was_willst_du": "nichts","mehr_zur_auswahl": ["g\u00e4r nix"]}]; 
 

 
var findKeyOf = function(key){ 
 
    var temp = myArray.map(function(e){ 
 
    return e[key]; 
 
    }); 
 
    var test = []; 
 
    for(let i in temp){ 
 
    if(Array.isArray(temp[i])){ 
 
     test = test.concat(temp[i]); 
 
    }else{ 
 
     test.push(temp[i]) 
 
    } 
 
    } 
 
    return test; 
 
}; 
 

 
var newArr = [ 
 
    {meine_frage:findKeyOf('meine_frage')}, 
 
    {ne_andere_frage:findKeyOf('ne_andere_frage')}, 
 
    {was_willst_du:findKeyOf('was_willst_du')}, 
 
    {mehr_zur_auswahl:findKeyOf('mehr_zur_auswahl')}, 
 
] 
 
console.log(newArr);

+0

danke, aber die Tasten sind unkwon – prince

3

Diese Funktion wird die Arbeit tun:

const example = array => { 
    let newObject = {} 
    array.forEach((element) => { 
     for(let key in element) { 
      if(typeof element[key] === 'object') { 
       element[key].forEach((el) => { 
        if(newObject[key] && newObject[key].length) { 
         newObject[key].push(el) 
        } 
        else { 
         newObject[key] = [el] 
        } 
       }) 
      } 
      else { 
       if(newObject[key] && newObject[key].length){ 
        newObject[key].push(element[key]) 
       } 
       else{ 
        newObject[key] = [element[key]] 
       } 
      } 
     } 
    }) 
    return newObject 
} 
3

Sie können array#reduce als Akkumulator verwenden und durch jeden Schlüssel des Objekts und array#concat die Werte durchlaufen.

var data = [{ "meine_frage": "hier kommt die antwort", "ne_andere_frage": "ne andere antwort", "was_willst_du": "alles", "mehr_zur_auswahl": ["einiges", "vieles und", "g\u00e4r nix"] }, { "meine_frage": "tom & jerry", "ne_andere_frage": "mickey maus", "was_willst_du":"oder", "mehr_zur_auswahl": ["manches", "einiges", "vieles und", "g\u00e4r nix"] }, { "meine_frage": "dick und doof", "ne_andere_frage": "minnie muas", "was_willst_du": "nichts", "mehr_zur_auswahl": ["g\u00e4r nix"] }]; 
 

 
var merged = data.reduce((r,o) => { 
 
    Object.keys(o).forEach(k => { 
 
    r[k] = (r[k] || []).concat(o[k]); 
 
    }) 
 
    return r; 
 
},{}); 
 

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

+0

funktioniert auch gut dank – prince

2

reduce und spread operator Mit

var data = [{ 
 
    "meine_frage": "hier kommt die antwort", 
 
    "ne_andere_frage": "ne andere antwort", 
 
    "was_willst_du": "alles", 
 
    "mehr_zur_auswahl": ["einiges", "vieles und", "g\u00e4r nix"] 
 

 
}, { 
 
    "meine_frage": "tom & jerry", 
 
    "ne_andere_frage": "mickey maus", 
 
    "was_willst_du": "oder", 
 
    "mehr_zur_auswahl": ["manches", "einiges", "vieles und", "g\u00e4r nix"] 
 

 
}, { 
 
    "meine_frage": "dick und doof", 
 
    "ne_andere_frage": "minnie muas", 
 
    "was_willst_du": "nichts", 
 
    "mehr_zur_auswahl": ["g\u00e4r nix"] 
 

 
}] 
 

 
let myData = data.reduce((b , a)=> { 
 
    Object.keys(a).forEach(key => { 
 
     if (Object.keys(b).indexOf(key) > -1) { 
 
      if (typeof a[key] === "object") { 
 
       b[key] = [...b[key], ...a[key]]  
 
      } else { 
 
       b[key].push(a[key]) 
 
      } 
 
       
 
     } else { 
 
      if (typeof a[key] === "object") { 
 
       b[key] = [...a[key]] 
 
      } else { 
 
       b[key] = [a[key]] 
 
      }     
 
     }  
 
    }) 
 
    return b 
 
}, {}) 
 

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

+0

Wo haben Sie zerstört Auftrag verwendet? –

+1

@ MihaiAlexandru-Ionut, habe ich meine Antwort aktualisiert. Es ist der "Spread Operator" – edkeveked

+1

rechts. +1 Stimme. –

Verwandte Themen