javascript - Ordenar un arreglo de palabras basado en otro arreglo de palabras
Tengo un arreglo así:
unorderedArr = ['pear', 'apple', 'banana', 'peach', 'pineapple'];
Me gustaría ordenar este arreglo basado en otro arreglo dado de esta manera:
order = ['peach', 'apple', 'pineapple']
El resultado preferido sería:
orderedArr = ['peach', 'apple', 'pineapple', 'banana', 'pear'];
No importa en qué índice se coloquen las palabras que no están en el arreglo de orden. No se garantiza que las palabras en el arreglo de orden estén en el arreglo desordenado
Solución de Código Actual
Intenté usar una sentencia switch así:
const orderedArr = []
unorderedArr.forEach(word => {
switch (word) {
case 'peach':
orderedArr.push(word);
break;
case 'apple':
orderedArr.push(word);
break;
case 'pineapple':
orderedArr.push(word);
break;
default:
orderedArr.push(word);
break;
}
});
Pero descubrí que una declaración switch no verifica primero el primer caso.
Respuesta #1
No creo que haya una manera fácil y no programática de hacer esto. Lo que necesitas es un algoritmo que produzca el resultado deseado, así:
function partialOrder(preferences, data)
{
var result, reminder;
result = [];
// find preferences and put them into result
preferences.forEach((name) => {
result = result.concat(
data.filter((d) => d.name === name)
);
});
// find remaining data not in preferences
reminder = data.filter((item) =>
preferences.indexOf(item.name) === -1
);
return result.concat(reminder);
}
var preferences = [ "peach", "pear", "pineapple", "<alien-fruit>" ];
var data = [
{ "name": "apple", "image_url": "xApple" },
{ "name": "pineapple", "image_url": "xPineapple" },
{ "name": "peach", "image_url": "xPeach" },
{ "name": "pear", "image_url": "xPear" },
{ "name": "banana", "image_url": "xBanana" }
];
console.log(partialOrder(preferences, data));Respuesta #2
Podrías tomar un objeto para el orden de clasificación y un valor predeterminado para los elementos que no tienen un orden.
var array = ['pear', 'apple', 'banana', 'peach', 'pineapple'],
wanted = ['peach', 'apple', 'pineapple'],
order = Object.assign({ default: Infinity }, ...wanted.map((v, i) => ({ [v]: i + 1 })));
array.sort((a, b) => (order[a] || order.default) - (order[b] || order.default));
console.log(array);