2016-05-16 89 views
1

我有數組對象如何排序基於關鍵陣列是不同

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

如何基於關鍵 我的意思是我希望得到的

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

我試圖解決這 -

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

我正在使用下劃線請給我建議任何解決方案。任何JavaScript本地解決方案也很好。 謝謝。

回答

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]; 
}); 
+0

對於我..對象是這樣的.. var obj = [{b:3},{c:2},{a:1}] –

+0

我爲您的情況添加更新。 –

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'} 
    ] 
0

您可以使用相同的結果Javscript的排序功能如下排序你的數組。

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

希望這會有所幫助。如有任何問題,請詢問。