如何根据不同的键对数组进行排序

时间:2016-05-16 06:44:52

标签: javascript underscore.js

我有数组对象

var myObj = [
    {'week2Volume': 'asdsadfd'},
    {'week1Volume': 'masdasaf'},
    {'week3Volume': 'dsfdsfsdf'}
  ] 

如何根据键对此进行排序 我的意思是我想要结果

var myObj = [
    {'week1Volume': 'masdasaf'},
    {'week2Volume': 'asdsadfd'},    
    {'week3Volume': 'dsfdsfsdf'}
  ] 

我尝试了什么 -

_.sortBy(myObj, function(o) { return o.toLowerCase();   })  

我正在使用下划线请建议我任何解决方案。任何JavaScript原生解决方案也都可以。 感谢。

3 个答案:

答案 0 :(得分:0)

_.mixin({
    'sortKeysBy': function (obj, comparator) {
        var keys = _.sortBy(_.keys(obj), function (key) {
            return comparator ? comparator(obj[key], key) : key;
        });

        return _.object(keys, _.map(keys, function (key) {
            return obj[key];
        }));
    }
});

然后:

var obj = {b: 3, c: 2, a: 1};

_.sortKeysBy(obj);
// {a: 1, b: 3, c: 2}

_.sortKeysBy(obj, function (value, key) {
    return value;
});
// {a: 1, c: 2, b: 3}

来源:gist

<强>更新
你有一个数组,而不是一个对象。所以你可以在没有任何插件的情况下对它进行排序。

_.sortBy(myObj, function(o) { 
  // return Object.keys(o)[0];
  return _.keys(o)[0];
});

答案 1 :(得分:0)

Underscore's documentation on sortBy()

  

返回(稳定)排序的列表副本,按通过iteratee 运行每个值的结果按升序排列。

(强调我的)

迭代器应该返回键进行排序:

_.sortBy(myObj, function(o){ return _.keys(o)[0]; })

通过第一个键过滤返回预期的对象。

_.keys(o);实际上返回了一组键。如果您希望更多密钥并且喜欢限制按键排序,您可以将结果传递给_.filter()

_.sortBy(myObj, function(o) {
    // filter the set of keys
    return _.filter(_.keys(o), function(key) {
        // filter key by this matcher
        return /^week[0-9]+Volume$/.test(key);
    })[0];
});

这样,它为

提供了相同的结果
var myObj = [
        {'b': 1, 'week2Volume': 'asdsadfd'},
        {'c': 2, 'week1Volume': 'masdasaf'},
        {'a': 3, 'week3Volume': 'dsfdsfsdf'}
    ] 

答案 2 :(得分:0)

您可以使用Javscript的sort函数对数组进行排序,如下所示。

var myObj = [
    {'week2Volume': 'asdsadfd'},
    {'week1Volume': 'masdasaf'},
    {'week3Volume': 'dsfdsfsdf'}
];

var sorted = myObj.sort(function (a, b) {
    return Object.keys(a)[0] > Object.keys(b)[0];
});

//This is the sorted array
console.dir(sorted);

希望这会有所帮助。如有任何问题请咨询。