Tengo una matriz de objetos que contienen los datos que quiero ordenar (tiene más propiedades), así:
[ { "data": { "id": "green" } }, { "data": { "id": "red" } }, { "data": { "id": "blue" } } ] id es una propiedad anidada que necesito usar para ordenar en función de las puntuaciones proporcionadas por un objeto diferente, así:
{ "green": 5, "red": 3, "blue": 8 }Estoy tratando de encontrar la mejor manera de ordenar mi matriz de objetos, sin embargo, hasta ahora no he tenido éxito.
La función de clasificación incorporada de Javascript tiene un parámetro de función de comparación opcional. El siguiente código utiliza esta función para resolver su problema:
var array = [ { "data": { "id": "green" } }, { "data": { "id": "red" } }, { "data": { "id": "blue" } } ]; var scores = { "green": 5, "red": 3, "blue": 8 }; array.sort((a, b) => (scores[a.data.id] - scores[b.data.id])); console.log(array);Puede ordenarlos así: https://jsfiddle.net/Ldvja31t/1/
const scores = { "green": 5, "red": 3, "blue": 8 }; const myData = [ { "data": { "id": "green" } }, { "data": { "id": "red" } }, { "data": { "id": "blue" } } ]; myData.sort((d1, d2) => { return scores[d1.data.id] - scores[d2.data.id] }); console.log(myData)Las dos respuestas que se dieron deberían funcionar bien. Sin embargo, también me gustaría agregar que podría usar un Enum. Ejemplo
Aquí hay un ejemplo separado del uso de una enumeración y ordenarlo en una matriz de objetos
const enum Order { Start = 'Start', Run = 'Run', End = 'End', } const predicate = (a, b) => { const map = {}; map[Order.Start] = 1; map[Order.Run] = 2; map[Order.End] = 3; if (map[a] < map[b]) { return -1; } if (map[a] > map[b]) { return 1; } return 0; } const data = [Order.End, Order.Run, Order.Start]; const result = data.sort(predicate); console.log(result);