2015-02-25 6 views
7

Ho un array con chiavi in ​​questo modo:Lodash sorta collezione basata su array esterno

['asdf12','39342aa','12399','129asg',...] 

ed una raccolta che ha queste chiavi in ​​ogni oggetto in questo modo:

[{guid: '39342aa', name: 'John'},{guid: '129asg', name: 'Mary'}, ... ] 

c'è un facile modo di ordinare la collezione in base all'ordine delle chiavi nel primo array?

+0

quale linguaggio hai usato? – Angu

+0

Sto usando javascript – silintzir

+0

@silintzir Ti preghiamo di prendere in considerazione [accettando una delle risposte] (http://meta.stackexchange.com/a/5235/235416) che ti aiuta di più. – thefourtheye

risposta

4

ingresso:

var data1 = ['129asg', '39342aa']; 
var data2 = [{ 
    guid: '39342aa', 
    name: 'John' 
}, { 
    guid: '129asg', 
    name: 'Mary' 
}]; 
  1. Innanzitutto creare un oggetto indice, con _.reduce, simili

    var indexObject = _.reduce(data2, function(result, currentObject) { 
        result[currentObject.guid] = currentObject; 
        return result; 
    }, {}); 
    
  2. E poi map gli elementi del primo array con gli oggetti da il indexObject, come questo

    console.log(_.map(data1, function(currentGUID) { 
        return indexObject[currentGUID] 
    })); 
    

uscita

[ { guid: '129asg', name: 'Mary' }, 
    { guid: '39342aa', name: 'John' } ] 

Nota: Questo metodo sarà molto efficace se si desidera ordinare tanti oggetti, perché ridurrà il look-up lineare nel secondo array che renderebbe l'intera logica eseguita in complessità di tempo O (M * N).

16
var sortedCollection = _.sortBy(collection, function(item){ 
    return firstArray.indexOf(item.guid) 
}); 
+0

Grazie, è una soluzione elegante – silintzir

+0

@silintzir Hai chiesto "un modo rapido per ordinare la raccolta" nella domanda. Ma questo non è un modo veloce, se intendevi davvero le prestazioni di runtime. – thefourtheye

+1

Questo funziona perfettamente ed è la soluzione più elegante che ho trovato – Backer

2

È possibile utilizzare indexBy(), e at() per ordinare la vostra collezione. Il vantaggio è che codice e prestazioni concisi. Utilizzando sortBy() qui fa il trucco, ma la matrice esterna è già ordinato:

var ids = [ 'cbdbac14', 'cf3526e2', '189af064' ]; 

var collection = [ 
    { guid: '189af064', name: 'John' }, 
    { guid: 'cf3526e2', name: 'Julie' }, 
    { guid: 'cbdbac14', name: 'James' } 
]; 

_(collection) 
    .indexBy('guid') 
    .at(ids) 
    .pluck('name') 
    .value(); 
// → [ 'James', 'Julie', 'John' ] 

Utilizzando at(), è possibile iterare la raccolta differenziata esterna, la costruzione di una nuova collezione dalla sorgente collection. La raccolta di origine è stata trasformata in un oggetto utilizzando indexBy(). Lo fai così a() ha accesso basato su chiave per ciascuno di esso è ids.