我有一个带有动态键的对象,我需要按值排序,如果值之间有联系,请使用键按字母顺序排序。
示例输入:
const unsortedObj = {
"a": 2,
"b": 3,
"c" : 2
}
预期输出:
const sortedOutput = {
"b": 3,
"a": 2,
"c": 2
}
到目前为止,我已经得到了这个lodash链接,至少可以根据值进行排序,但不知道当出现平局时如何应用第二个/alpubeutical条件:
const sortedObj = _.fromPairs(
_.sortBy(_.toPairs(unsortedObj), 1).reverse()
);
对于复杂排序,应该使用_.orderBy()
。
将iteratees(第二个参数(设置为要按([1, 0]
(排序的索引-首先按索引1排序,如果有按索引0排序的平局。
将orders
(第三个参数(设置为对每个索引进行排序的方式([desc, asc]
(-按索引1降序排序,但按索引0升序排序。
const unsortedObj = {
"a": 2,
"b": 3,
"c": 2
}
const sortedObj = _.fromPairs(
_.orderBy(
_.toPairs(unsortedObj),
[1, 0],
['desc', 'asc']
)
);
console.log(sortedObj)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous"></script>
使用lodash/fp,您可以使用_.flow()
:创建可重复使用和可读的函数
const fn = _.flow(
_.toPairs,
_.orderBy([1, 0], ['desc', 'asc']),
_.fromPairs
)
const unsortedObj = {
"a": 2,
"b": 3,
"c": 2
}
const sortedObj = fn(unsortedObj);
console.log(sortedObj)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>