Tengo una matriz con claves como esta:
['asdf12','39342aa','12399','129asg',...]y una colección que tiene estas claves en cada objeto así:
[{guid: '39342aa', name: 'John'},{guid: '129asg', name: 'Mary'}, ... ]¿Hay una forma rápida de ordenar la colección según el orden de las claves en la primera matriz?
var sortedCollection = _.sortBy(collection, function(item){ return firstArray.indexOf(item.guid) });Aquí hay un simple agregado a la respuesta aceptada en caso de que desee colocar los elementos no coincidentes al final de sortedCollection y no al principio:
const last = collection.length; var sortedCollection = _.sortBy(collection, function(item) { return firstArray.indexOf(item.guid) !== -1? firstArray.indexOf(item.guid) : last; });Aporte:
var data1 = ['129asg', '39342aa']; var data2 = [{ guid: '39342aa', name: 'John' }, { guid: '129asg', name: 'Mary' }]; Primero cree un objeto de índice, con _.reduce , como este
var indexObject = _.reduce(data2, function(result, currentObject) { result[currentObject.guid] = currentObject; return result; }, {}); Y luego map los elementos de la primera matriz con los objetos del indexObject , así
console.log(_.map(data1, function(currentGUID) { return indexObject[currentGUID] }));Producción
[ { guid: '129asg', name: 'Mary' }, { guid: '39342aa', name: 'John' } ]Nota: este método será muy eficiente si desea ordenar tantos objetos, ya que reducirá la búsqueda lineal en la segunda matriz, lo que haría que toda la lógica se ejecutara en una complejidad de tiempo O(M * N).