我想在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}
答案 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方法来映射和减少已排序集合中的集合。阅读评论,如果您需要更多说明,请告诉我们!
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;
答案 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);