【问题标题】:Sort array of objects by nested property with lodash使用 lodash 按嵌套属性对对象数组进行排序
【发布时间】:2019-02-24 15:00:28
【问题描述】:

我有一个这样的对象数组

[{ ‘a’: { id: 4 }}, { ‘b’: { id: 3 }}, { ‘c’: { id: 2 }}, { ‘d’: { id: 5 }}]

我想通过 lodash 了解根据 id 对对象进行排序。我希望收到类似[‘d’, ‘a’, ‘b’, ‘c’] 的东西。

我尝试搜索此内容,但没有找到适用于每个对象中不同键的答案。我尝试使用 lodash 的不同功能(很多)来做到这一点。所以我认为可能有一个很好的而且可能很短的方法来解决这个问题。

【问题讨论】:

  • 第一步,将您的数组转换为[{key: 'a', id: 4}, {key: 'b', id: 3}, …]

标签: javascript lodash


【解决方案1】:

这是一个简单的 JavaScript 解决方案。

由于想要得到排序后的keys作为结果,所以这个方案没有修改原始数组,感谢sort之前的第一个map

const data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}];

const sorted = data
  .map(x => Object.entries(x)[0])
  .sort((a, b) => b[1].id - a[1].id)
  .map(x => x[0]);
  
console.log(sorted);

如果你不关心改变原始数组,你可以直接用Object.values()排序,然后用Object.keys()返回第一个键:

const data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}];

const sorted = data
  .sort((a, b) => Object.values(b)[0].id - Object.values(a)[0].id)
  .map(x => Object.keys(x)[0]);
  
console.log(sorted);

【讨论】:

    【解决方案2】:

    您可以通过使用 sort 方法并映射返回的数组并返回键来简单地使用 javascript 来完成

    var data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]
    
    const res = data.sort((a, b)  => Object.values(b)[0].id - Object.values(a)[0].id).map(obj => Object.keys(obj)[0]);
    
    console.log(res);

    或者您可以将 lodash 与 orderBy 和 map 方法一起使用

        var data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]
    
        const res = _.orderBy(data, function(a) {
          return Object.values(a)[0].id
        }, ['desc']).map(o => Object.keys(o)[0])
        
        console.log(res);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

    【讨论】:

    • 这与@CodeManiac 已经发布的解决方案完全相同
    • @Bergi 如果您看到,发布时间并没有太大差异,两个人完全有可能同时在 sn-p 上工作并发布相同的答案,因为这是一个非常标准的解决方法
    【解决方案3】:

    您可以先根据 id 进行排序,然后再映射键。

    let obj = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]
    
    let op = obj
            .sort((a,b) => Object.values(b)[0].id - Object.values(a)[0].id)
            .map(e => Object.keys(e)[0])
    
    console.log(op)

    【讨论】:

      【解决方案4】:

      这是jo_va's solutionlodash/fp 版本。

      使用_.flow() 创建将每个对象映射到[key, { id }] 对的函数。根据id_.orderBy() 进行排序。使用_.map() 迭代并提取_.head()(密钥):

      const { flow, flatMap, toPairs, orderBy, map, head } = _
      
      const fn = flow(
        flatMap(toPairs), // convert each object to pair of [key, { id }]
        orderBy(['[1].id'], ['desc']), // order descending by the id
        map(head) // extract the original key
      )
      
      const data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]
      
      const result = fn(data)
      
      console.log(result)
      <script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

      【讨论】:

        【解决方案5】:

        const data = [{ a: { id: 4 }}, { b: { id: 3 }}, { c: { id: 2 }}, { d: { id: 5 }}];
        data.sort((a, b) => Object.values(b)[0].id - Object.values(a)[0].id);
        console.log(data);

        上面的 sn-p 显示了如何使用 Array.sort 来完成。 Lodash 应该类似地工作。

        【讨论】:

          猜你喜欢
          • 2023-01-06
          • 1970-01-01
          • 2018-07-02
          • 2017-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多