首页 > 解决方案 > 使用 lodash 按子值对对象进行排序

问题描述

我有以下对象:

const object = {
  "9c8vDTruRDPi937aHMMz":{
    name: "item1",
    createdAt: {
      seconds: 1582227276, 
      nanoseconds: 68000000
    }
  },
  "rAexYu2rAz0AEnD77x5p":{
    name: "item2",
    createdAt: {
      seconds: 1582227577,
      nanoseconds: 922000000
    }
  }
}

并希望根据 createdAt.seconds 对其进行排序并将其保留为对象。

例如,返回值将是(如果根据秒数和 Desc 排序):

const sortedByDateObject = {
  "rAexQu3rdm0AEnD77x5p":{
    name: "item2",
    createdAt: {
      seconds: 1582227577,
      nanoseconds: 922000000
    }
  },
  "9c8vDGryRSZi817aHMMz":{
    name: "item1",
    createdAt: {
      seconds: 1582227276, 
      nanoseconds: 68000000
    }
  }
}

知道如何使用 lodash 对数组进行排序,但不知道这种带有嵌套对象的复杂任务。

任何帮助都非常感谢:)

标签: javascriptobjectlodashjavascript-objects

解决方案


这会将您的对象变成一个可以正确排序的数组(正如@Taki 所指出的,不保证对象属性顺序)。

const object = {
  "9c8vDTruRDPi937aHMMz":{
    name: "item1",
    createdAt: {
      seconds: 1582227276, 
      nanoseconds: 68000000
    }
  },
  "rAexYu2rAz0AEnD77x5p":{
    name: "item2",
    createdAt: {
      seconds: 1582227577,
      nanoseconds: 922000000
    }
  }
};

const orderedArray = _.chain(object)
  .toPairs()
  .map(([key, ...obj]) => ({
    key,
    ...obj[0],
    createdAtSeconds: obj[0].createdAt.seconds
  }))
  .orderBy(['createdAtSeconds'], ['desc'])
  .map(({ createdAtSeconds, ...obj }) => obj)
  .value()
  
console.log(orderedArray);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>


推荐阅读