javascript sort sparse array keep indexes

前端 未结 4 542
野性不改
野性不改 2021-02-02 07:51

What is the best method to sort a sparse array and keep the elements on the same indexes? For example:

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


        
相关标签:
4条回答
  • 2021-02-02 08:25

    You can

    1. Use filter or Object.values to obtain an array with the values of your sparse array.
    2. Then sort that array, from largest to smaller. Be aware it's not stable, which may be specially problematic if some values are not numeric. You can use your own sorting implementation.
    3. Use map and pop to obtain the desired array. Assign it to a.
    var b = a.filter(function(x) {
        return true;
    }).sort(function(x,y) {
        return y - x;
    });
    a = a.map([].pop, b);
    

    Or, in ECMAScript 2017,

    a = a.map([].pop, Object.values(a).sort((x,y) => y-x));
    
    0 讨论(0)
  • 2021-02-02 08:26

    Here's one approach. It copies the defined array elements to a new array and saves their indexes. It sorts the new array and then puts the sorted results back into the indexes that were previously used.

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

    Working demo: http://jsfiddle.net/jfriend00/3ank4/

    0 讨论(0)
  • 2021-02-02 08:37
    // 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 }
    ]
    
    0 讨论(0)
  • 2021-02-02 08:38
    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]
    
    0 讨论(0)
提交回复
热议问题