我想返回由_.orderBy()
方法返回的第一个对象的键,该方法按嵌套属性进行排序。
Here is the CodePen demo.在这种情况下,我想要返回的密钥是"charlie"
。
console.clear();
const ob = {
"alpha": {
"id": 27,
"lottery": {
"id": 1,
"name": "La Primitiva",
"jackpotAmount": 500,
}
},
"bravo": {
"id": 28,
"lottery": {
"id": 1,
"name": "La Primitiva",
"jackpotAmount": 10,
}
},
"charlie": {
"id": 29,
"lottery": {
"id": 1,
"name": "La Primitiva",
"jackpotAmount": 1000,
}
},
}
const out = _.orderBy(ob, (e) => {
return e.lottery.jackpotAmount;
}, ['desc'] ); // How do I get key of first property, "charlie"?
console.log(out);
答案 0 :(得分:3)
这不是获得最高jackpotAmount的最有效方法。排序为O(n log n)。您可以在O(n)时间内找到最高值。这也是创建列表的临时副本,因此它为临时操作使用了大量额外内存。使用_.maxBy()会更有效。
var x = _.maxBy(ob, (e) => { return e.lottery.jackpotAmount; });
return x.id;
这些功能适用于列表。要获取密钥而不是项目,您需要迭代密钥。
var keys = Object.keys(ob);
return _.maxBy(keys, (e) => { return ob[e].lottery.jackpotAmount; });
请注意,这并不能完全解决效率问题。根据javascript引擎,需要密钥数组和ob [e]查找的开销会将空间使用量降低到O(n),并且可能会降低O(n log n)的复杂性。
如果你的目标是现代JS引擎,你可以使用手写搜索的Map对象来获得恒定的空间和线性时间搜索。
const getMax = function (map) {
let maxValue = null;
let maxKey = null;
map.forEach((value, key) => {
if (value.lottery.jackpotAmount > maxValue) {
maxValue = value.lottery.jackpotAmount;
maxKey = key;
}
});
return maxKey;
};
这是Codepen demo。
干杯