Sorting an Array of JavaScript Objects a Specific Order (using existing function)

前端 未结 4 1183

Given an array of objects:

{
    key: \"a\",
    value: 42
},
{
    key: \"d\",
    value: 28
},
{
    key: \"c\",
    value: 92
},
{
    key: \"b\",
    value: 8         


        
相关标签:
4条回答
  • 2020-12-04 15:06
    // create hash map el.key -> index, to help us with direct access, avoid searching
    const hashMap = arr.reduce((acc, el, index) => { acc[el.id] = el; return acc }, {})
    
    // finally, map the ids to the final result
    const ids.map(id => hashMap[id])
    
    0 讨论(0)
  • 2020-12-04 15:14

    Great answers provided so far. Thought that the following may also be an alternative solution in plain JS:

    var arr = arr.sort(function(a,b) {
        return order.indexOf( a.key ) - order.indexOf( b.key );
        //for the sake of recent versions of Google Chrome use:
        //return a.key.charCodeAt(0) > b.key.charCodeAt(0); or return a.key.charCodeAt(0) - b.key.charCodeAt(0);
    });
    

    var arr = [
        {
            key: "a",
            value: 42
        },
        {
            key: "d",
            value: 28
        },
        {
            key: "c",
            value: 92
        },
        {
            key: "b",
            value: 87
        }
    ];
    
    var order = ["c", "a", "b", "d"];
    
    console.log( 'Original: ', JSON.stringify( arr ) );
    
    var arr = arr.sort(function(a,b) {
          return order.indexOf( a.key ) - order.indexOf( b.key );
    });
    
    console.log( 'Ordered: ', JSON.stringify( arr ) );

    0 讨论(0)
  • 2020-12-04 15:20

    I can't claim that this is the most efficient way, but you can use the key for each object as a key for properties in another object. Then simply access them by these keys.

    for (x = 0; x < objn.length; x++) {
        newobj[objn[x].key] = objn[x];
    }
    objn = [];
    for (x = 0; x < keys.length; x++) {
        objn.push(newobj[keys[x]]);
    }
    console.log(objn);
    

    http://jsfiddle.net/WdehF/

    0 讨论(0)
  • 2020-12-04 15:26

    Just use indexOf to convert the key to the correct order:

    var order = ["c", "a", "b", "d"];
    _.sortBy(arr, function(obj){ 
        return _.indexOf(order, obj.key);
    });
    

    Fiddle

    If there are a lot of keys, then it would be advantageous to make a hash-map out of the array, like:

    var order = ["c", "a", "b", "d"];
    var orderMap = {};
    _.each(order, function(i) { orderMap[i] = _.indexOf(order, i); });
    

    This makes the key-sorting lookup constant time rather than O(n). (Fiddle)

    0 讨论(0)
提交回复
热议问题