用lodash按嵌套属性对对象数组进行排序

时间:2019-02-24 15:00:28

标签: javascript lodash

我有一个这样的对象数组

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

我想用lodash知道根据id对对象的排序。我希望收到类似[‘d’, ‘a’, ‘b’, ‘c’]的东西。

我试图进行搜索,但没有找到适用于每个对象中不同键的答案。我试图通过lodash的不同功能来做到这一点(很多)。因此,我认为解决这个问题可能是一种好方法,也可能是一种短方法。

5 个答案:

答案 0 :(得分:4)

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

由于要获得排序后的键,因此,由于map之前的第一个sort,此解决方案不会修改原始数组:

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);

答案 1 :(得分:3)

您可以通过使用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>

答案 2 :(得分:1)

您可以先根据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)

答案 3 :(得分:1)

这是lodash/fpjo_va's solution版本。

使用_.flow()创建一个将每个对象映射到[key, { id }]对的函数。根据{{​​1}}用_.orderBy()排序。迭代id并解压缩_.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)

答案 4 :(得分:0)

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);

上面的代码片段显示了如何使用Array.sort。罗珊(Lodash)的工作应该与此类似。