为了更好地理解如何操作对象,我尝试根据对象的值对其进行排序。
例如:
let obj = {
1: 5,
2: 4,
3: 200,
4: 3,
5: 1
}我想要一个输出
{
3: 200,
1: 5,
2: 4,
4: 3,
5: 1
}我遍历了对象,并将其键值对添加到一个新数组中,然后按值进行排序。
新数组如下所示
[
[3, 200],
[1, 5],
[2, 4],
[4, 3],
[5, 1]
]然后我循环遍历这个数组,并从它创建一个新对象,但它的结果是
{ 1: 5, 2: 4, 3: 200, 4: 3, 5: 1 }为什么?
let obj = {
1: 5,
2: 4,
3: 200,
4: 3,
5: 1
}
const sortObj = o => {
const arr = [];
const _obj = {};
for (const v in o) arr.push([v, o[v]]);
arr.sort((a, b) => b[1] - a[1]);
for (const v of arr) {
console.log(v);
/*
[
[3, 200],
[1, 5],
[2, 4],
[4, 3],
[5, 1]
]
*/
const [key, val] = v;
console.log(key, val);
_obj[key] = val;
}
return _obj;
}
console.log(sortObj(obj));
发布于 2018-10-24 10:19:31
从ES2015开始,对象键几乎始终保持其插入顺序。然而,少数值得注意的例外之一是当你的键是整数的时候。
下面的例子显示,当我们使用string键时,排序工作得很好……
let obj = {
test: 5,
this: 4,
out: 200,
and: 3,
see: 1
}
const sortObj = o => {
const arr = [];
const _obj = {};
for (const v in o) arr.push([v, o[v]]);
arr.sort((a, b) => b[1] - a[1]);
for (const v of arr) {
const [key, val] = v;
_obj[key] = val;
}
return _obj;
}
console.log(sortObj(obj));
或者,使用始终保留顺序的Map。
let obj = {
1: 5,
2: 4,
3: 200,
4: 3,
5: 1
}
const sortObj = o => {
const arr = [];
const _obj = new Map();
for (const v in o) arr.push([v, o[v]]);
arr.sort((a, b) => b[1] - a[1]);
for (const v of arr) {
const [key, val] = v;
_obj.set(key, val);
}
return _obj;
}
var sortedMap = sortObj(obj);
sortedMap.forEach((val, key) => console.log(`${key}: ${val}`));
发布于 2018-10-24 10:29:18
好吧,上面已经有了一个有效的答案,但我会把它贴出来,因为我已经开始尝试排序,并且有一个更短的版本。
相关阅读:Does JavaScript Guarantee Object Property Order?
let obj = {
1: 5,
2: 4,
3: 200,
4: 3,
5: 1
}
sortedObj = Object.keys(obj).sort((key1, key2) => {
if (obj[key1] > obj[key2]) {return -1;}
if (obj[key1] < obj[key2]) {return 1;}
return 0;
}).reduce((acc, key) => {
acc['i_'+key] = obj[key];
return acc;
}, {});发布于 2018-10-24 11:30:38
如果可以使用Map,它将保持我在上面的评论中提到的顺序。使用Map的好处是,您的键不会被转换为字符串,它还保留了类型。
let obj = {
1: 5,
2: 4,
3: 200,
4: 3,
5: 1
}
const sortObj = o => {
const arr = [];
const map = new Map();
for (const v in o) arr.push([v, o[v]]);
arr.sort((a, b) => b[1] - a[1]);
for (const v of arr) {
console.log(v);
/*
[
[3, 200],
[1, 5],
[2, 4],
[4, 3],
[5, 1]
]
*/
const [key, val] = v;
//console.log(key, val);
map.set(key,val);
}
return map;
}
sortObj(obj).forEach((k,v)=>console.log(v,k))
https://stackoverflow.com/questions/52960165
复制相似问题