2016-12-25 6 views
4

ich unter zwei Arrays:erstellen gruppiert Array mit zwei verschiedenen Arrays

array1 = [{ 
    "type":"test", 
    "name":"name1"}, 
{ 
    "type":"dev", 
    "name":"name2"}] 

array2=[{ 
     "type":"test", 
     "name":"name3"}, 
     { 
     "type":"dev", 
     "name":"name4"}, 
     { 
     "type":"prod", 
     "name":"name5"}] 

ich gruppieren möchten zwei Arrays mit „Typ“ und erstellen Sie ein neues Array etwas wie folgt aus:

finalArray=[{ 
      "type":"test", 
      "info":[{ 
         "type":"test", 
         "name":"name1"}], 
        [{ 
         "type":"test", 
         "name":"name3" 
        }]}, 
      { 
       "type":"dev", 
       "info":[{ 
         "type":"dev", 
         "name":"name2"}], 
        [{ 
         "type":"dev", 
         "name":"name4"}]}, 
      { 
       "type":"prod", 
       "info":[], 
        [{ 
         "type":"prod", 
         "name":"name5"}] 
       }] 

Gibt es trotzdem, dass ich dies mit Javascript, angularjs2, lodash, jquery erreichen kann. Ich bin in der Lage zu gruppieren und neues Objekt wie in using lodash .groupBy. how to add your own keys for grouped output?

erwähnt, aber nur, ich möchte immer die Daten aus dem zweiten Array in Index = 1 von "info" und erste zu Index = 0 schieben. Wenn eines der Arrays keinen "type" hat, sollte das "info" -Array leere/null-Werte haben.

Antwort

1

Es ist möglich, das gewünschte Ergebnis in Javascript zu erreichen oder Helfer wie lodash zu verwenden. Der letzte Teil Ihrer Frage ist schwer zu verstehen. Wenn ein Array keinen "Typ" hat, wie würden Sie sie gruppieren. Bitte geben Sie eine klarere Erklärung oder ändern Sie Ihre erwartete Eingabe und Ausgabe.

[Aktualisiert] Vielen Dank für Ihre Erklärung. Dies ist die Lösung, die einfaches JavaScript verwendet.

// get uniques type from two arrays 
const uniqueTypes = new Set(array1 
          .concat(array2) 
          .map(x => x.type)); 

// loop the types, find item in both array 
// group it 
let result = Array.from(uniqueTypes).reduce((acc, curr) => { 
    const item1 = array1.find(x => x.type === curr); 
    const item2 = array2.find(x => x.type === curr); 

    const info1 = item1 ? [item1] : []; 
    const info2 = item2 ? [item2] : []; 

    acc = acc.concat({ type: curr, info: [info1, info2] }); 

    return acc; 
}, []); 


console.log(result); 

jsbin hier: https://jsbin.com/mobezogaso/edit?js,console

+0

deine Frage zu - "Typ": "prod" ju ist st im zweiten Array (array2), der Rest der Typen befindet sich in beiden Arrays - also wird im letzten Array der 'info'-Schlüssel gehalten - ein leeres Array (Typ nicht in Array1 vorhanden) und einer mit Schlüssel/Werten aus Array2 (wenn ich richtig verstehe) :) – sinisake

+0

aktualisiert Basis auf Ihre Erklärung. es ist jetzt klar. – Chybie

+0

@Chybie - Danke für die Lösung, die ich erwarte. Ich habe noch ein Problem, wie kann ich 'type' dynamisch in .map (x => x.type) übergeben. Weil ich dies in einer gemeinsamen Methode behielt, damit ich verschiedene Schlüssel gruppieren kann, indem ich den Schlüsselnamen als Parameter übergebe. – user3878988

1

Hier ist eine Arbeitslösung :). Ich hoffe es hilft!

var array1 = [ 
 
{ 
 
"type":"test", 
 
"name":"name1" 
 
}, 
 
{ 
 
"type":"dev", 
 
"name":"name2" 
 
} 
 
] 
 

 
var array2 = [ 
 
{ 
 
"type":"test", 
 
"name":"name3" 
 
}, 
 
{ 
 
"type":"dev", 
 
"name":"name4" 
 
}, 
 
{ 
 
"type":"prod", 
 
"name":"name5" 
 
} 
 
] 
 

 

 
var newArray = array1.concat(array2); 
 
var arr1 = []; 
 
var arr2 = []; 
 
var arr3 = []; 
 
var arrTypes = []; 
 
var finalArray = []; 
 
var someArray = []; 
 

 
for(var i in newArray) 
 
{ 
 
if (arrTypes.indexOf(newArray[i].type) === -1){ 
 
    arrTypes.push(newArray[i].type); 
 
} 
 

 
if(newArray[i].type === "test"){ 
 
    arr1.push(newArray[i]); 
 
} 
 
else if(newArray[i].type === "dev"){ 
 
    arr2.push(newArray[i]); 
 
} 
 
else if(newArray[i].type === "prod"){ 
 
    arr3.push(newArray[i]); 
 
} 
 
} 
 
someArray.push(arr1); 
 
someArray.push(arr2); 
 
someArray.push(arr3); 
 

 
for(var j = 0; j < someArray.length; j++){ 
 
\t finalArray.push({ 
 
\t \t "type": arrTypes[j], 
 
\t \t "info": someArray[j] 
 
\t }); 
 
} 
 
console.log(finalArray);

2

Verwendung _.mapValues auf Objektwerte iterieren mit Schlüssel

var res = _.chain(array1) 
    .concat(array2) 
    .groupBy('type') 
    .mapValues(function(val, key) { 
     return { 
      type: key, 
      info: val 
     }; 
    }) 
    .values() 
    .value(); 
0

Und eine kurze (unlesbar?) ES6 Lösung Zugriff auf:

  1. Concat den Arrays
  2. Reduzieren Sie das Array in einem Map-Objekt, mit dem Typ als Schlüssel
  3. Holen Sie sich die Einträge iterator - Taste (Typ) - Wert (Array von Objekten)
  4. Nutzung SPREAD den Eintrag Iterator auf ein Array
  5. zu konvertieren Array#Map die Anordnung der Einträge auf den Typ/Info-Objekte

const array1 = [{"type":"test","name":"name1"},{"type":"dev","name":"name2"}]; 
 
const array2=[{"type":"test","name":"name3"},{"type":"dev","name":"name4"},{"type":"prod","name":"name5"}]; 
 

 
const result = [...array1.concat(array2).reduce((r, o) => { 
 
    r.has(o.type) ? r.get(o.type).push(o) : r.set(o.type, [o]); 
 
    return r; 
 
    }, new Map).entries()] 
 
    .map(([type, info]) => ({ 
 
    type, info 
 
    })); 
 

 
console.log(result);

Verwandte Themen