问题描述
let o = {
a: {value: 3},
b: {value: 1},
c: {value: 4},
d: {value: 2}
};
我们知道 c>a>d>b,所以输出应该是
{
a: {value: 3, order: 2},
b: {value: 1, order: 4},
c: {value: 4, order: 1},
d: {value: 2, order: 3}
}
如何在 js 中实现?
1楼
Nina Scholz
5
已采纳
2019-02-21 12:09:41
您可以使用对象的值对键进行排序,并将顺序分配给给定的键。
let o = { a: { value: 3 }, b: { value: 1 }, c: { value: 4 }, d: { value: 2 } }; Object .keys(o) .sort((a, b) => o[b].value - o[a].value) .forEach((k, i) => o[k].order = i + 1); console.log(o);
.as-console-wrapper { max-height: 100% !important; top: 0; }
2楼
Nick Parsons
2
2019-02-21 12:12:34
您可以对对象中的值进行排序,然后遍历对象键以检查当前值是否与sorted数组中的当前值相同,如果是,则可以将当前对象order属性设置为 index+ 1(因为索引从 0 开始):
请参阅下面的示例:
const o = { a: {value: 3}, b: {value: 1}, c: {value: 4}, d: {value: 2} }, sorted = Object.values(o).sort(({value:a},{value:b}) => ba); sorted.forEach(({value}, i) => { for(key in o) { if(o[key].value == value) o[key].order = i+1 } }); console.log(o);
但是,就时间复杂度而言,这不是最佳解决方案,我相信可以改进
3楼
yunzen
1
2019-02-21 13:19:16
结合和的答案
let myObject = { a: {value: 3}, b: {value: 1}, c: {value: 4}, d: {value: 2} }; Object .values(myObject) .sort(({value: a}, {value: b}) => ba) .forEach((k, i) => k.order = i+1) console.log(myObject)
.as-console-wrapper { max-height: 100% !important; top: 0; }