Búsqueda de sitios web

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);

Artículos relacionados