2016-05-30 17 views
1

Ich habe die folgende Reihe von eindeutigen IDs:Sortierung Array von Objekten basierend auf Index in anderer Array

idArray = ["56f4cf96dd2ca7275feaf802", 
"56f4cf96dd2ca7275feaf7b7", 
"56f4cf96dd2ca7275feaf805", 
"56f4cf96dd2ca7275feaf7ac"] 

Und ich habe noch eine Reihe von Objekten:

stories = [{"title": Story2, id = "56f4cf96dd2ca7275feaf7b7"}, 
{"title": Story4, id = "56f4cf96dd2ca7275feaf7ac"}, 
{"title": Story1, id = "56f4cf96dd2ca7275feaf802"}, 
{"title": Story3, id = "56f4cf96dd2ca7275feaf805"}] 

Wie ich die zweiten sortieren Array basierend auf dem Index des ersten Arrays? Vorzugsweise mit lodash, da die Arrays ein bisschen größer werden können.

Bisher ich habe folgendes auf die Indizes aus dem ersten Array zu erhalten:

var sortArray = _.toPairs(idArray) 

[ [ '0', 56f4cf96dd2ca7275feaf802 ], 
[ '1', 56f4cf96dd2ca7275feaf7b7 ], 
[ '2', 56f4cf96dd2ca7275feaf805 ], 
[ '3', 56f4cf96dd2ca7275feaf7ac ] ] 

Der Versuch, verschiedene Kombinationen von _.map() und _.sortBy() ich nicht richtig scheinen, zu erhalten das Ergebnis, das ich das will, ist:

desiredResult = [{"title": Story1, id = "56f4cf96dd2ca7275feaf802"}, 
      {"title": Story2, id = "56f4cf96dd2ca7275feaf7b7"}, 
      {"title": Story3, id = "56f4cf96dd2ca7275feaf805"}, 
      {"title": Story4, id = "56f4cf96dd2ca7275feaf7ac"}] 

Antwort

3

Ich glaube, die Art Lösung sehr ineffektiv ist vor allem, da Sie die Arrays erwarten später wachsen größer. Sort ist "bestenfalls" eine O (2n) -Operation, während Sie zwei indexOf-Operationen pro Zyklus ein anderes O (2n^2) haben. Ich schlage folgendes vor, was die Sortiermethode in großen Arrays übertrifft.

var stories = [{"title": 'Story2', id : "56f4cf96dd2ca7275feaf7b7"}, 
 
{"title": 'Story4', id : "56f4cf96dd2ca7275feaf7ac"}, 
 
{"title": 'Story1', id : "56f4cf96dd2ca7275feaf802"}, 
 
{"title": 'Story3', id : "56f4cf96dd2ca7275feaf805"}], 
 

 
    idArray = ["56f4cf96dd2ca7275feaf802", 
 
"56f4cf96dd2ca7275feaf7b7", 
 
"56f4cf96dd2ca7275feaf805", 
 
"56f4cf96dd2ca7275feaf7ac"], 
 

 
ordered = idArray.reduce((p,c) => p.concat(stories.find(f => f.id == c)) ,[]); 
 

 
console.log(ordered);

Nur O (n^2)

1

dieses Versuchen

var idsToIndexes = {}; 

for (var i = 0; i < idArray.length; i++) 
    idsToIndexes[idArray[i]] = i; 

stories.sort(function(a, b){return idsToIndexes[a.id] - idsToIndexes[b.id];}); 
2

Dies ist möglich, ohne Bibliothek usin zu tun Array.sort() g

var stories = [{"title": 'Story2', id : "56f4cf96dd2ca7275feaf7b7"}, 
 
{"title": 'Story4', id : "56f4cf96dd2ca7275feaf7ac"}, 
 
{"title": 'Story1', id : "56f4cf96dd2ca7275feaf802"}, 
 
{"title": 'Story3', id : "56f4cf96dd2ca7275feaf805"}]; 
 

 
var idArray = ["56f4cf96dd2ca7275feaf802", 
 
"56f4cf96dd2ca7275feaf7b7", 
 
"56f4cf96dd2ca7275feaf805", 
 
"56f4cf96dd2ca7275feaf7ac"]; 
 

 
var ordered = stories.sort(function(a, b){ 
 
\t return idArray.indexOf(a.id) - idArray.indexOf(b.id); 
 
}); 
 

 
ordered.forEach(element =>{ console.log(element) });

+2

Genau mein Gedanke. Du schlägst mich dazu ... Hier, hab eine Geige: https://jsfiddle.net/jx3we8q7/;) – Pevara

+1

Danke, tolle Antwort. Ist es in Ordnung, 'idArray.indexOf (b.id) - dArray.indexOf (a.id)' zurückzugeben, um die Reihenfolge umzukehren? Oder sollte ich reverse() für das resultierende Array verwenden? – user1202888

+1

Ich denke, es gibt nichts Schlechtes, es zu tun. –

Verwandte Themen