¿Hay una forma elegante de reordenar la matriz de JavaScript? Por ejemplo, dice que tengo una matriz como esta:
let array = ['a', 'b', 'c']Ahora quiero reorganizar esto para
['b', 'a', 'a', 'c', 'a']¿Existe una función de orden superior incorporada para hacer eso en JavaScript? Algo como
let reordered = array.reorderMagic([1, 0, 0, 2, 0])¿Dónde podría especificar una matriz de índice? Si no, ¿puede sugerir una biblioteca que pueda ayudarme a hacer este tipo de manipulaciones similares a matrices?
Puede crear un método en Array.prototype aunque no se recomienda
Leer: JavaScript: ¿Cuáles son los peligros de extender Array.prototype?
if (!('reorderMagic' in Array.prototype)) { Array.prototype.reorderMagic = function(ref) { const arr = this; return ref.map((n) => arr[n]); }; } let array = ["a", "b", "c"]; let reordered = array.reorderMagic([1, 0, 0, 2, 0]); console.log(reordered); But I won't recommend that because there might be a scenario where someone or any library might override your method(This is just one scenario)
Entonces puede hacer una función de utilidad y obtener el resultado deseado como:
function reorderMagic(arr, ref) { return ref.map((n) => arr[n]); } let array = ["a", "b", "c"]; let reordered = reorderMagic(array, [1, 0, 0, 2, 0]); console.log(reordered);Puede crear un método en Array.prototype
Extending Array.prototype se considera una mala práctica, pero el resto de la solución funciona bien.
Recomendaría una API como esta en su lugar:
function chooseIndices(arr, indexes) { return indexes.map(i => arr[i]); }Y luego usarlo como tal:
let array = ["a", "b", "c"]; let reordered = chooseIndices(array, [1, 0, 0, 2, 0]); // reordered === ['b', 'a', 'a', 'c', 'a'] La función anterior no tiene en cuenta los índices no válidos. Por ejemplo, si usa el índice 5 en el ejemplo anterior, solo obtendrá un undefined para él.
Puede decidir cómo quiere manejar los índices no válidos. Pero una opción sería simplemente filter antes de usar la matriz de índice.
const arr = ['a','b','c']; const order = [1, 0, 0, 2, 0]; const reorderMagic = (arr, indexes) => indexes.map((i) => arr[i]); console.log(reorderMagic(arr, order)); // [ "b","a","a","c","a"]