使用 lodash 对具有多个条件和未知键的对象进行排序

Sorting object with multiple conditions and unknown keys using lodash

我有一个带有动态键的对象,我需要按值对其进行排序,如果值之间存在联系,请使用该键按字母顺序排序。

示例输入:


   const unsortedObj = { 
      "a": 2, 
      "b": 3, 
      "c" : 2 
    }

预期输出:

   const sortedOutput = {
    "b": 3,
    "a": 2,
    "c": 2
   }

到目前为止,我已经将这个 lodash 链接至少按值排序,但无法弄清楚如何在出现平局时应用 second/alphabeutical 条件:

    const sortedObj = _.fromPairs(
        _.sortBy(_.toPairs(unsortedObj), 1).reverse()
    );

对于复杂的排序,您应该使用 _.orderBy()

将迭代器(第二个参数)设置为您要排序的索引([1, 0])- 首先按索引 1 排序,如果有平局则按索引 0 排序。

orders(第 3 个参数)设置为您希望对每个索引进行排序的方式 ([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>