如何在ASC中对javascript对象键进行排序

时间:2017-05-24 06:54:23

标签: javascript

我想在ASC中对对象键进行排序。我的键是字符串和数字,所以尝试使用sort不能解决。

//sorting number function
function sortNum(a,b) {
    return a - b;
}
let obj = {key10:10,key2:2,key5:5,key1:1};
let ordered = {};
Object.keys(obj).sort().forEach(function(key,v){
    ordered[key] = v;
});
console.log(ordered); //{key1: 1, key10: 10, key2: 2, key5: 5}
//try with sort number function
//Object.keys(obj).sort(sortNum).forEach(function(key){
//ordered[key] = obj[key];
//});
//console.log(ordered); -> {key10: 10, key2: 2, key5: 5, key1: 1}
  

预期=> {key1: 1, key2: 2, key5: 5, key10: 10}

4 个答案:

答案 0 :(得分:1)

由于它们都具有相同的开始(键),因此通过比较数字进行排序。

我已将其存储为可用于访问原始对象的数组。



let obj = {key10:10,key2:2,key5:5,key1:1};
var ordered = Object.keys(obj).sort( (a,b) => {
  let numA = a.match(/\d+/);
  let numB = b.match(/\d+/);
  return +numA - +numB;
});
console.log(ordered);




答案 1 :(得分:0)

尝试Array#sort排序ASC订单和Array#reduce用于返回对象.Finally /(\d+)/用于查找密钥中的数字

let obj = {key10:10,key2:2,key5:5,key1:1};
var ordered = Object.keys(obj).sort((a,b)=>{
       return  parseInt(a.match(/(\d+)/)) < parseInt(b.match(/(\d+)/)) ? -1 : parseInt(a.match(/(\d+)/)) > parseInt(b.match(/(\d+)/)) ? 1 :0;
}).reduce((a,b) => (a[b]=obj[b] ,a),{})
console.log(ordered);

答案 2 :(得分:0)

我使用Array.prototype方法来映射和减少已排序集合中的集合。阅读评论,如果您需要更多说明,请告诉我们!

&#13;
&#13;
let obj = {
  key10: 10,
  key2: 2,
  key5: 5,
  key1: 1
};
let ordered = (Object
  // creates an array of keys
  .keys(obj)
  // map each key into a tuples of {key, value} objects
  .map(key => ({
    key,
    value: obj[key]
  }))
  // sort those objects by the value
  .sort((a, b) => a.value - b.value)
  // then reduce back into another object
  .reduce((ordered, {key, value}) => {
    ordered[key] = value;
    return ordered;
  }, {})
);


console.log(ordered);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

您可以使用字符串的两个部分,非数字,按字符串排序和数字部分,使用正则表达式按数字排序。

let obj = { key10: 10, key2: 2, key5: 5, key1: 1, foo1000: 1000, foo0: 0, foo20: 20 },
    keys = Object.keys(obj);

keys.sort(function (a, b) {
    function parts(s) { return s.match(/\D+|\d+/g); }
    var aa = parts(a),
        bb = parts(b);
    return aa[0].localeCompare(bb[0]) || aa[1] - bb[1];
});

console.log(keys);