2016-08-09 5 views
2

ich dieses ArrayZusammenführen von zwei Objekt in einem Array

var arr1 = [{id: 1, name: "lorem"}, {id: 1, name: "ipsum"}, {id: 2, name: "dolor"}] 

wie Sie hier die ersten 2 indexs sehen sie haben gleiche id, möchte ich die ouput so etwas wie dieses

newArr sein

[ 
    { 
    id: 1, 
    name: ["lorem", "ipsum"] 
    }, 
    { 
    id: 2, 
    name: "dolor" 
    } 
] 

Antwort

2

reduzieren und Karte verwenden, können Sie ganz leicht umwandeln es zu dem, was man wollte

var arr1 = [{id: 1, name: "lorem"}, {id: 1, name: "ipsum"}, {id: 2, name: "dolor"}]; 
 

 
var obj = arr1.reduce((a,b) => (b.id in a?a[b.id].push(b.name):a[b.id]=[b.name],a),{}), 
 
    newArr = Object.keys(obj).map(id => ({id, name : obj[id]})); 
 

 
console.log(newArr);

+0

Durchführung Sie können mit 'console.log' mit stacksnippets und es wird immer noch die Ausgabe hier auf der Seite zeigen, wenn Sie Klicken Sie auf Ausführen. Ziemlich süß^_^ – naomik

+2

Leider endet das mit nichts im Array-Index '0'. Da dies mit ES6 getaggt ist, verwenden Sie statt dieses Arrays eine richtige 'Map'. – Bergi

4

Ich mag diese Lösung besser, weil es die Sortierung abstrahiert, sondern ermöglicht es Ihnen, zu steuern, wie Elemente mit einer Funktion höherer Ordnung zusammengestellt werden.

Beachten Sie, wie wir sagen nichts über x.id oder x.name oder names.concat([name]) innerhalb collateBy. Diese Prozedur hat keine Kenntnis über die Art von Daten, die Sie möglicherweise sammeln.

// generic collation procedure 
 
const collateBy = f => g => xs => { 
 
    return xs.reduce((m,x) => { 
 
    let v = f(x) 
 
    return m.set(v, g(m.get(v), x)) 
 
    }, new Map()) 
 
} 
 

 
// reusable collateById procedure 
 
const collateById = collateBy (x => x.id) 
 

 
// custom concatNames procedure 
 
// note use of `{name:[]}` which is the "seed" value for an empty collation 
 
const concatNames = xs=> { 
 
    let collation = collateById ((a={name:[]}, b) => 
 
    Object.assign(a, b, { name: [...a.name, b.name] }) 
 
) (xs) 
 
    return Array.from(collation.values()) 
 
} 
 

 
// sample data 
 
let arr1 = [ 
 
    {id: 1, name: "lorem"}, 
 
    {id: 1, name: "ipsum"}, 
 
    {id: 2, name: "dolor"} 
 
] 
 

 
console.log(concatNames (arr1))

Funktionen höherer Ordnung zeigen, wie leistungsfähig generische Verfahren mag collateBy sein kann. Hier ist ein weiteres Beispiel der exakt gleichen collateBy Verfahren verwenden, aber eine ganz andere Sortierungs

const collateBy = f => g => xs => { 
 
    return xs.reduce((m,x) => { 
 
    let v = f(x) 
 
    return m.set(v, g(m.get(v), x)) 
 
    }, new Map()) 
 
} 
 

 
const collateEvenOdd = collateBy (x => x % 2 === 0 ? 'even' : 'odd') 
 

 
const sumEvenOdd = collateEvenOdd ((a=0, b) => a + b) 
 

 
let data = [2,3,4,5,6,7] 
 
let collation = sumEvenOdd (data) 
 
let even = collation.get('even') 
 
let odd = collation.get('odd') 
 

 
console.log('even sum', even) // 2 + 4 + 6 === 12 
 
console.log('odd sum', odd) // 3 + 5 + 7 === 15

+0

Clevere Verwendung von Standardinitialisierern! – Bergi

+0

Danke! Und danke für die 'Array.from' Bearbeitung. Ich habe das vergessen^_^ – naomik

+0

@Bergi, ah! Ich habe gerade die Aktualisierung von 'a = {}' zu 'a = {name: []}' bemerkt. Dynamite Empfehlung^_^あ り が と う! – naomik

Verwandte Themen