Tengo una matriz 2D:
var array1 = [ ["Jasper", "Diesel", "Grid", 2.7], ["Delta", "Solar", "Grid", 10], ["Alpha", "Wind", "Grid", 20] ] Quiero ordenar array1 por la primera columna usando:
var sortingArray = ["Alpha","Jasper","Delta]Así que debería verse así:
var sortedArray = [ ["Alpha", "Wind", "Grid", 20], ["Jasper", "Diesel", "Grid", 2.7], ["Delta", "Solar", "Grid", 10] ] Ya intenté usar la función de sort a continuación, pero no cambia la matriz en absoluto. ¿No necesito especificar qué posición quiero ordenar?
array1.sort(function (a, b) { return sortingArray.indexOf(a) - sortingArray.indexOf(b); })ACTUALIZACIÓN: Desde la publicación he resuelto el problema. Como sospechaba, necesitaba proporcionar qué posición quería ordenar. La solucion es:
array1.sort(function (a, b) { return sortingArray.indexOf(a[0) - sortingArray.indexOf(b[0]); })a y b son matrices, los primeros elementos son cadenas. Puede comparar cadenas utilizando el método de cadena localeCompare :
array1.sort((a, b) => a[0].localeCompare(b[0]))array1.sort(function (a, b) { return sortingArray.indexOf(a[0) - sortingArray.indexOf(b[0]); })Puede reducir la matriz de clasificación a un Map para una búsqueda rápida.
const array1 = [ ["Jasper", "Diesel", "Grid", 2.7], ["Delta", "Solar", "Grid", 10], ["Alpha", "Wind", "Grid", 20] ] const sortingArray = ["Alpha", "Jasper", "Delta"]; /** * Sorts the data by a list of values. * @param {Object[]|Array[]} data - an array of objects or arrays * @param {String|Number} fieldOrIndex - a field name or index * @param {String[]} order - the sorting order of the values * @return {Object[]|Array[]} sorted data */ const sortWith = (data, fieldOrIndex, order) => { const orderMap = order.reduce((acc, token, index) => acc.set(token, index), new Map); return data.sort((a, b) => orderMap.get(a[fieldOrIndex]) - orderMap.get(b[fieldOrIndex])); }; const sorted = sortWith(array1, 0, sortingArray); console.log(sorted); .as-console-wrapper { top: 0; max-height: 100% !important; }Si su lista o elementos son pequeños, puede omitir el mapa y simplemente tomar los índices.
const array1 = [ ["Jasper", "Diesel", "Grid", 2.7], ["Delta", "Solar", "Grid", 10], ["Alpha", "Wind", "Grid", 20] ] const sortingArray = ["Alpha", "Jasper", "Delta"]; /** * Sorts the data by a list of values. * @param {Object[]|Array[]} data - an array of objects or arrays * @param {String|Number} fieldOrIndex - a field name or index * @param {String[]} order - the sorting order of the values * @return {Object[]|Array[]} sorted data */ const sortWith = (data, fieldOrIndex, order) => data.sort((a, b) => order.indexOf(a[fieldOrIndex]) - order.indexOf(b[fieldOrIndex])); const sorted = sortWith(array1, 0, sortingArray); console.log(sorted); .as-console-wrapper { top: 0; max-height: 100% !important; }