what type query first collection javascript sorting sparse-array

javascript - type - query document mongodb



javascript sort sparse array keep indexes (4)

¿Cuál es el mejor método para ordenar una matriz dispersa y mantener los elementos en los mismos índices? Por ejemplo:

a[0] = 3, a[1] = 2, a[2] = 6, a[7] = 4, a[8] = 5,

Me gustaría después del género tener

a[0] = 2, a[1] = 3, a[2] = 4, a[7] = 5, a[8] = 6.


Aquí hay un enfoque. Copia los elementos de matriz definidos a una nueva matriz y guarda sus índices. Clasifica la nueva matriz y luego vuelve a colocar los resultados ordenados en los índices que se usaron previamente.

var a = []; a[0] = 3; a[1] = 2; a[2] = 6; a[7] = 4; a[8] = 5; // sortFn is optional array sort callback function, // defaults to numeric sort if not passed function sortSparseArray(arr, sortFn) { var tempArr = [], indexes = []; for (var i = 0; i < arr.length; i++) { // find all array elements that are not undefined if (arr[i] !== undefined) { tempArr.push(arr[i]); // save value indexes.push(i); // save index } } // sort values (numeric sort by default) if (!sortFn) { sortFn = function(a,b) { return(a - b); } } tempArr.sort(sortFn); // put sorted values back into the indexes in the original array that were used for (var i = 0; i < indexes.length; i++) { arr[indexes[i]] = tempArr[i]; } return(arr); }

Demostración de trabajo: http://jsfiddle.net/jfriend00/3ank4/


Usted puede

  1. Use filter u Object.values para obtener una matriz con los valores de su matriz dispersa.
  2. Luego sort esa matriz, de mayor a menor. Tenga en cuenta que no es estable, lo que puede ser especialmente problemático si algunos valores no son numéricos. Puede usar su propia implementación de clasificación.
  3. Usa el map y pop para obtener la matriz deseada. Asignarlo a a .

var b = a.filter(function(x) { return true; }).sort(function(x,y) { return y - x; }); a = a.map([].pop, b);

O, en ECMAScript 2017,

a = a.map([].pop, Object.values(a).sort((x,y) => y-x));


// Update for your needs (''position'' to your key). function updateIndexes( list ) { list.sort( ( a, b ) => a.position - b.position ) list.forEach( ( _, index, arr ) => { arr[ index ].position = index } ) } var myList = [ { position: 8 }, { position: 5 }, { position: 1 }, { position: 9 } ] updateIndexes( myList ) // Result: var myList = [ { position: 1 }, { position: 2 }, { position: 3 }, { position: 4 } ]


var arr = [1,2,3,4,5,6,7,8,9,10]; // functions sort function sIncrease(i, ii) { // ascending if (i > ii) return 1; else if (i < ii) return -1; else return 0; } function sDecrease(i, ii) { //descending if (i > ii) return -1; else if (i < ii) return 1; else return 0; } function sRand() { // random return Math.random() > 0.5 ? 1 : -1; } arr.sort(sIncrease); // return [1,2,3,4,5,6,7,8,9,10] arr.sort(sDecrease); // return [10,9,8,7,6,5,4,3,2,1] arr.sort(sRand); // return random array for examle [1,10,3,4,8,6,9,2,7,5]