2017-06-19 5 views
0

Also lassen Sie uns sagen, ich habe ein Array:Sortieren Array von Objekt basierend auf einem anderen Array

const chunks = [ 
    {id: 0, names: ['app']}, 
    {id: 1, names: ['contact']}, 
    {id: 2, names: ['bootstrap']} 
]; 

Und ich will es auf der Grundlage der names Eigenschaft sortiert werden, so ist die Reihenfolge wie in diesem Array:

const original = ['bootstrap', 'app', 'contact']; 

Was ist der effizienteste Weg, dies zu tun?

+1

Was ist die Logik hinter der Sortierung? –

+1

Warum ist 'name' ein Array und was sollte passieren, wenn es mehr oder weniger als genau ein Element enthält? – Bergi

+0

Wie behandelt man '{id: 999, Namen: ['app', 'bootstrap']}}? – georg

Antwort

1

Sie die delat des Indizes von Namen in Original nutzen könnten.

const chunks = [{ id: 0, names: ['app'] }, { id: 1, names: ['contact'] }, { id: 2, names: ['bootstrap'] }], 
 
    original = ['bootstrap', 'app', 'contact']; 
 

 
chunks.sort((a, b) => original.indexOf(a.names[0]) - original.indexOf(b.names[0])); 
 

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

1

Versuchen Sie diese Methode:

const chunks = [{id: 0, names: ['app']}, {id: 1, names: ['contact']}, {id: 2, names: ['bootstrap']}]; 
const original = ['bootstrap', 'app', 'contact']; 
let result = []; 
for(let i = 0; i < original.length; i++) { 
    for(let j = 0; j < chunks.length; j++) { 
     if(chunks[j].names.indexOf(original[i]) !== -1) { 
      result.push(chunks[j]); 
     } 
    } 
} 
console.log(result); 
+0

Das ist, was ich am Anfang dachte, aber @NinaScholz Weg ist so viel sauberer! – Ancinek

1

einfache Art und Weise: konvertieren Stücke in ein Objekt, so dass Sie die richtigen nur mit dem Schlüssel erhalten, Karte dann über das Array (bereits sortierte) in dem Objekt an seinem Platz zu stecken.

cMap = chunks.reduce((p,c) => Object.assign(p, {[c.names[0]]: c}), {}); 
const sorted = original.map(k => cMap[k]); 
+0

Netter Ansatz, aber Sie wollen erwähnen, dass dies nur funktioniert, wenn es genau einen Brocken pro Name gibt. – Bergi

+0

Stimmt, das habe ich nicht berücksichtigt. Zum Glück gibt es mehr Aufmerksamkeit auf SO als ich :). – cheesenthusiast

Verwandte Themen