Ordenar um array da mesma forma que outro array em JavaScript
Eu tenho 2 arrays:
[2, 4, -2, 4, 1, 3]
["a", "b", "c", "d", "e", "f"]
e eu quero que eles sejam classificados pelo array numérico:
// output
[-2, 1, 2, 3, 4, 4] // <-sorted by numerical order
["c", "e", "a", "f", "b", "d"] // sorted exactly the same order as the first array
enquanto na verdade não é importante se "b" ou "d" vem primeiro (ambos têm 4 neste exemplo)
Encontrei muitas perguntas sobre isso online, mas nenhuma delas funcionou para mim. Alguém pode me ajudar com isso?
Resposta #1
Você poderia ordenar as chaves do primeiro array com base em seu valor. Isso retornará um array com os índices do array ordenados com base no valor do array numbers. Em seguida, use map para obter os valores ordenados com base nos índices
const numbers = [2, 4, -2, 4, 1, 3],
alphabets = ["a", "b", "c", "d", "e", "f"]
const keys = Array.from(numbers.keys()).sort((a, b) => numbers[a] - numbers[b])
const sortedNumbers = keys.map(i => numbers[i]),
sortedAlphabets = keys.map(i => alphabets[i])
console.log(
sortedNumbers,
sortedAlphabets
)Resposta #2
Um método padrão é pegar os índices do array-chave para ordenação e ordenar os índices como padrão para todos os outros arrays pegando o índice e o valor do array-chave.
No final, mapeie os arrays ordenados.
var array1 = [2, 4, -2, 4, 1, 3],
array2 = ["a", "b", "c", "d", "e", "f"],
indices = [...array1.keys()].sort((a, b) => array1[a] - array1[b]);
[array1, array2] = [array1, array2].map(a => indices.map(i => a[i]));
console.log(...array1);
console.log(...array2);