使用lodash通过可选属性订购javascript数组

时间:2017-10-11 08:18:40

标签: javascript arrays underscore.js lodash

我有一个javascript数组。像这样的东西:

let myObjects = [{
        'name': 'name 1',
        'date': '2017-04-15T22:00:00Z',
        'date2': '2017-04-12T22:00:00Z' },

      { 'name': 'name 2',
        'date': '2017-04-05T22:00:00Z' },

      { 'name': 'name 3',
        'date': '2017-04-05T22:00:00Z' },

      { 'name': 'name 4',
        'date': '2017-04-12T22:00:00Z',
        'date2': '2017-04-10T22:00:00Z' }];

我想按myObjects订购date2,但如果该对象没有此属性,则应将其视为date值。

我可以这样做:

myObjects.map(function(obj){ if(!obj.date2){ obj['date2'] = obj['date']; }});
let orderedObjects = _.orderBy(myObjects, 'date2', true);

但我认为这是一个棘手的解决方案。这可以只使用orderBy函数而不改变原始数组吗?

2 个答案:

答案 0 :(得分:2)

_.orderBy()与iteratees函数一起使用。对于每个元素destructure date2date,如果date不存在,则返回date2



const myObjects = [{"name":"name 1","date":"2017-04-15T22:00:00Z","date2":"2017-04-12T22:00:00Z"},{"name":"name 2","date":"2017-04-05T22:00:00Z"},{"name":"name 3","date":"2017-04-05T22:00:00Z"},{"name":"name 4","date":"2017-04-12T22:00:00Z","date2":"2017-06-10T22:00:00Z"}];
        
const orderedObjects = _.orderBy(myObjects, ({ date2, date }) => date2 || date, true);

console.log(orderedObjects);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以将_orderBy与回调函数结合使用,该函数会检查date2值是否存在{否} date值。

这是你应该怎么做的:

_.orderBy(myObjects, function(o) {
  return o.date2 ? o.date2 : o.date;
}, true);

<强>演示:

&#13;
&#13;
let myObjects = [{
    'name': 'name 1',
    'date': '2017-04-15T22:00:00Z',
    'date2': '2017-04-12T22:00:00Z'
  },

  {
    'name': 'name 2',
    'date': '2017-04-05T22:00:00Z'
  },

  {
    'name': 'name 3',
    'date': '2017-04-05T22:00:00Z'
  },

  {
    'name': 'name 4',
    'date': '2017-04-12T22:00:00Z',
    'date2': '2017-04-10T22:00:00Z'
  }
];

let ordered = _.orderBy(myObjects, function(o) {
  return o.date2 ? o.date2 : o.date;
}, true);

console.log(ordered);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>
&#13;
&#13;
&#13;

您可以查看显示类似用例的 lodash orderBy on nested property