【问题标题】:Using lodash is it possible to sort an array of objects using several parameters使用 lodash 是否可以使用多个参数对对象数组进行排序
【发布时间】:2018-01-24 00:03:31
【问题描述】:

使用lodash 我希望能够通过几个键对如下所示的对象数组(但更大)进行排序,其中一些键嵌套在数组中:优先级为:

  1. 给定年份的收入(即提供(比如说)2012 年,收入将为 用于该年的所有元素)
  2. displayInGraph(真实)
  3. pinnedRow(真实)

我也希望能够扭转上述情况。

我查看了lodash documentation,但看不到我的问题的解决方案:

[{
    displayInGraph: true,
    pinnedRow: true,
    dateRange: [{
      year: 2010,
      income: 20000
    }, {
      year: 2011,
      income: 30000
    }, {
      year: 2012,
      income: 40000
    }, {
      year: 2013,
      income: 44000
    }]
  },
  {
    displayInGraph: true,
    pinnedRow: false,
    dateRange: [{
      year: 2010,
      income: 20000
    }, {
      year: 2011,
      income: 32500
    }, {
      year: 2012,
      income: 50000
    }, {
      year: 2013,
      income: 45200
    }]
  },

  {
    displayInGraph: true,
    pinnedRow: false,
    dateRange: [{
      year: 2010,
      income: 20400
    }, {
      year: 2011,
      income: 38000
    }, {
      year: 2012,
      income: 30000
    }, {
      year: 2013,
      income: 45000
    }]
  },

  {
    displayInGraph: true,
    pinnedRow: true,
    dateRange: [{
      year: 2010,
      income: 21030
    }, {
      year: 2011,
      income: 39000
    }, {
      year: 2012,
      income: 44000
    }, {
      year: 2013,
      income: 45400
    }]
  }
]

提前感谢您的解决方案

【问题讨论】:

  • 仅供参考,您的 sn-p 不是有效的 javascript,(您的年份/收入数组没有键)。
  • @CRice,谢谢 - 已编辑...

标签: javascript arrays sorting lodash


【解决方案1】:

您可以使用 lodash 对对象中的多个属性进行排序,方法是让迭代函数返回您要排序的属性数组。此示例将按属性a 排序,然后是属性b,然后是属性sortkey

var input = [
 { a: 4, b: 5, data: 9, sortkey: "blue" },
 { a: 3, b: 9, data: 27, sortkey: "red" },
 { a: 3, b: 9, data: 4, sortkey: "green" },
 { a: 3, b: 3, data: 19, sortkey: "purple" },
 { a: 4, b: 3, data: 6, sortkey: "white" },
 { a: 5, b: 0, data: 0, sortkey: "orange" }
];

var output = _.sortBy(input, function(o) {
  return [o.a, o.b, o.sortkey];
});

见小提琴:https://jsfiddle.net/mikeular/qog6h9ez/3/

然后您可以通过更新数组来反转排序行为。例如,如果您希望 a 升序、b 降序和 sortkey 升序,您可以执行以下操作:

var output = _.sortBy(input, function(o) {
  return [o.a, -1 * o.b, o.sortkey];
});

(我更喜欢-1 * o.b 而不是-o.b 以提高反转的可见性)。

这将是一个有趣的练习,看看它与更清洁​​的效果相比如何:

var output = _.sortBy(input, ['a', 'b', 'sortkey']);

...如果性能与您相关。

【讨论】:

    【解决方案2】:

    Lodash 有一个_.sortBy 方法,它的第二个参数可以是字符串(作为排序属性的路径)、函数(返回排序属性)或其数组。因此,您可以使用排序函数数组对多个参数进行排序:

    const myArray = [{
        displayInGraph: true,
        pinnedRow: true,
        dateRange: [{
          year: 2010,
          income: 20000
        }, {
          year: 2011,
          income: 30000
        }, {
          year: 2012,
          income: 40000
        }, {
          year: 2013,
          income: 44000
        }]
      },
      {
        displayInGraph: true,
        pinnedRow: false,
        dateRange: [{
          year: 2010,
          income: 20000
        }, {
          year: 2011,
          income: 32500
        }, {
          year: 2012,
          income: 50000
        }, {
          year: 2013,
          income: 45200
        }]
      },
    
      {
        displayInGraph: true,
        pinnedRow: false,
        dateRange: [{
          year: 2010,
          income: 20400
        }, {
          year: 2011,
          income: 38000
        }, {
          year: 2012,
          income: 30000
        }, {
          year: 2013,
          income: 45000
        }]
      },
    
      {
        displayInGraph: true,
        pinnedRow: true,
        dateRange: [{
          year: 2010,
          income: 21030
        }, {
          year: 2011,
          income: 39000
        }, {
          year: 2012,
          income: 44000
        }, {
          year: 2013,
          income: 45400
        }]
      }
    ]
    
    console.log(_.sortBy(myArray, [
        item => (item.dateRange.find(range => range.year === 2012) || {income: 0}).income,
        item => item.displayInGraph,
        item => item.pinnedRow,
    ]));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

    最后,您可以使用javascript内置数组.reverse方法来反转结果。

    【讨论】:

      【解决方案3】:

      你试过sortBy吗?它可以接收用于执行排序的每个步骤的函数列表。

      例如,您可以:

      const year = 2012;
      const getIncome = (obj) => _.find(obj.dateRange, {income: year});
      _.sortBy(users, [getIncome, 'displayInGraph', 'pinnedRow']);
      

      【讨论】:

        猜你喜欢
        • 2017-09-08
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多