将JavaScript对象数组排序为特定顺序(使用现有函数)

mko*_*ala 23 javascript arrays sorting jquery underscore.js

给定一组对象:

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

和一组键:

["c", "a", "b", "d"]
Run Code Online (Sandbox Code Playgroud)

是否有ECMAScript函数或第三方JavaScript库,允许您在一行/函数调用中排序第一个对象数组,以匹配第二个数组中指定的键的顺序,结果是:

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

提供功能或算法的其他问题:

相似/相关问题:

McG*_*gle 45

只需使用indexOf将密钥转换为正确的顺序:

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

小提琴

如果有很多键,那么从数组中创建一个哈希映射是有利的,例如:

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

这使得键排序查找恒定时间而不是O(n).(小提琴)

  • @mkopala你可以使用_.mixin()http://underscorejs.org/#mixin将你自己的函数添加到下划线 (2认同)
  • 这个例子对我来说并不是很清楚.这是另一个让我清楚的例子,http://jsfiddle.net/vsn32xp3/. (2认同)

Pet*_*rKA 20

到目前为止提供的答案很棒 认为以下也可能是普通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);
});
Run Code Online (Sandbox Code Playgroud)

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 ) );
Run Code Online (Sandbox Code Playgroud)

  • 我很确定这应该是 `order.indexOf( a.key ) - order.indexOf( b.key )` 而不是布尔比较运算符。 (8认同)
  • 在Chrome 60中,我无法直接从排序回调中返回一个布尔值,而我需要返回`-1`,`0`或`1`中的一个. (3认同)

use*_*498 5

const obj = [
    {
        key: "a",
        value: 42
    },
    {
        key: "d",
        value: 28
    },
    {
        key: "c",
        value: 92
    },
    {
        key: "b",
        value: 87
    }
]


const sortList = ["c", "a", "b", "d"];
    
    
const sortedObj = obj.sort((a, b) => {
    return (
        sortList.indexOf(a.key) - sortList.indexOf(b.key)
    );
});

console.log(sortedObj );
Run Code Online (Sandbox Code Playgroud)