【问题标题】:How to sort different arrays of objects inside an array如何对数组中的不同对象数组进行排序
【发布时间】:2019-05-12 10:08:24
【问题描述】:

如何在一个数组中分别对 2 个对象数组进行排序? 需要 Lodash 的解决方案。 谢谢。

按年份排序的数组示例:

var objects = [[{
      year: 2010,
      name: "john",
      value: 30
    },
    {
      year: 2009,
      name: "john",
      value: 40
    }
  ],
  [{
      year: 2018,
      name: "bob",
      value: 40
    },
    {
      year: 2015,
      name: "bob",
      value: 30
    }]]

按年份排序后的期望输出:

[[{
      year: 2009,
      name: "john",
      value: 40
    },
    {
      year: 2010,
      name: "john",
      value: 30
    }
  ],
  [{
      year: 2015,
      name: "bob",
      value: 30
    },
    {
      year: 2018,
      name: "bob",
      value: 40
    }]]

【问题讨论】:

标签: javascript arrays object lodash


【解决方案1】:

每个子集合上的orderBy 就足够了

var objects = [
[{
year: 2010,
name: "john", 
value: 30
},
{
year: 2009,
name: "john",
value: 40
}],
[{
year: 2018,
name: "bob", 
value: 40
},
{
year: 2015,
name: "bob",
value: 30
}]
]

console.log(objects.map(subObject => _.orderBy(subObject, "year")));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    您可以在数组数组上使用map(),并在 map 函数中返回排序后的数组。

    var arr = [[{year:2010,name:"john",value:30},{year:2009,name:"john",value:40}],[{year:2018,name:"bob",value:40},{year:2015,name:"bob",value:30}]];
    
    
    const res = arr.map(x => x.slice().sort((a,b) => a.year - b.year));
    console.log(res)

    【讨论】:

    • 你为什么使用 slice ?
    • @AmitBaranes sort() 修改原始数组。如果我不使用slice(),那么原始数组应该会改变。它只是为了复制数组。
    • 很好,不知道:)
    • @MaheerAli:实际上我不明白,因为当我执行console.log(arr) 时,在我看来arr 保持不变,而res 已排序。我可以知道如何证明你在说什么
    • @Isaac 我的意思是,如果你不使用slice(),那么原始数组即arr 将被更改。在我的代码中,我使用的是slice(),所以arr 保持不变。删除slice()你会看到数组被修改并排序。
    【解决方案3】:

    您需要映射数组并对其进行排序:

    const objects = [
    [{
    year: 2010,
    name: "john", 
    value: 30
    },
    {
    year: 2009,
    name: "john",
    value: 40
    }],
    [{
    year: 2018,
    name: "bob", 
    value: 40
    },
    {
    year: 2015,
    name: "bob",
    value: 30
    }]
    ] 
    
    const sorted = objects.map(r=>r.sort((a,b)=>a.year - b.year));
    
    console.log(sorted)

    【讨论】:

      【解决方案4】:

      您可以使用_.partialRight()_.map()_.sortBy() 子数组生成函数:

      const { partialRight: pr, map, sortBy } = _;
      
      const sortSubArrays = pr(map, arr => sortBy(arr, 'year'));
      
      const objects = [[{year:2010,name:"john",value:30},{year:2009,name:"john",value:40}],[{year:2018,name:"bob",value:40},{year:2015,name:"bob",value:30}]];
      
      const output = sortSubArrays(objects);
      
      console.log(output);
      .as-console-wrapper { max-height: 100% !important; top: auto; }
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

      或者使用 lodash/fp 并删除 partialRight:

      const { map, sortBy } = _;
      
      const sortSubArrays = map(sortBy('year'));
      
      const objects = [[{year:2010,name:"john",value:30},{year:2009,name:"john",value:40}],[{year:2018,name:"bob",value:40},{year:2015,name:"bob",value:30}]];
      
      const output = sortSubArrays(objects);
      
      console.log(output);
      .as-console-wrapper { max-height: 100% !important; top: auto; }
      <script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 2015-08-28
        • 1970-01-01
        • 2011-08-18
        相关资源
        最近更新 更多