【问题标题】:Lodash: How to group, then sort collection by more than one propertyLodash:如何分组,然后按多个属性对集合进行排序
【发布时间】:2021-04-22 07:27:34
【问题描述】:

如何按多个属性对我的收藏集进行分组和排序?

我的收藏看起来像

const list = [
  {
    transactionId: "Id1",
    amount: 100,
    timestamp: 1619075704230,
    user: "username1",
  },
  {
    transactionId: "Id2",
    amount: 5,
    timestamp: 1619075704230,
    user: "username2",
  },
  {
    transactionId: "Id3",
    amount: 8,
    timestamp: 1619075704230,
    user: "username3",
  },
  {
    transactionId: "Id4",
    amount: 12,
    timestamp: 1619075704230,
    user: "username1",
  },
  {
    transactionId: "Id5",
    amount: 200,
    timestamp: 1619075704230,
    user: "username7",
  },
  {
    transactionId: "Id6",
    amount: 99,
    timestamp: 1619075704230,
    user: "username1",
  },
  {
    transactionId: "Id7",
    amount: 78,
    timestamp: 1619075704230,
    user: "username1",
  },
  {
    transactionId: "Id8",
    amount: 12,
    timestamp: 1619075704230,
    user: "username9",
  },
];

我想按user属性对列表进行分组,然后将接收到的数组按timestampamount字段排序。

确切的反应应该是这样的

{
....
  "username1": [
    {
      transactionId: "Id1",
      amount: 100,
      timestamp: 1619075704230,
      user: "username1",
    },
    ,
    {
      transactionId: "Id6",
      amount: 99,
      timestamp: 1619075704230,
      user: "username1",
    },
    {
      transactionId: "Id7",
      amount: 78,
      timestamp: 1619075704230,
      user: "username1",
    },
    {
      transactionId: "Id4",
      amount: 12,
      timestamp: 1619075704230,
      user: "username1",
    }
  ]
  ...
}

【问题讨论】:

    标签: javascript node.js lodash


    【解决方案1】:

    您可以使用groupByorderBy 函数来实现。

    const list = [
      {
        transactionId: "Id1",
        amount: 100,
        timestamp: 1619075704230,
        user: "username1",
      },
      {
        transactionId: "Id2",
        amount: 5,
        timestamp: 1619075704230,
        user: "username2",
      },
      {
        transactionId: "Id3",
        amount: 8,
        timestamp: 1619075704230,
        user: "username3",
      },
      {
        transactionId: "Id4",
        amount: 12,
        timestamp: 1619075704230,
        user: "username1",
      },
      {
        transactionId: "Id5",
        amount: 200,
        timestamp: 1619075704230,
        user: "username7",
      },
      {
        transactionId: "Id6",
        amount: 99,
        timestamp: 1619075704230,
        user: "username1",
      },
      {
        transactionId: "Id7",
        amount: 78,
        timestamp: 1619075704230,
        user: "username1",
      },
      {
        transactionId: "Id8",
        amount: 12,
        timestamp: 1619075704230,
        user: "username9",
      },
    ];
    
    const sorted = _.orderBy(list, ['timestamp', 'amount'], ['desc', 'desc']);
    
    const result = _.groupBy(sort, 'user');
    
    console.log('Result: ', result);
    

    【讨论】:

      【解决方案2】:

      如果你使用lodash

      你可以这样做

      let grouped = _.groupBy(list,'user');
      
      let ordered = {};
      
      for (const [key, value] of Object.entries(grouped)) {
        ordered[key] = _.orderBy(value,['timeStamp','amount']);
      }
      
      console.log(orderedArray);
      

      【讨论】:

        猜你喜欢
        • 2018-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-15
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多