我有一个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
函数而不改变原始数组吗?
答案 0 :(得分:2)
将_.orderBy()
与iteratees函数一起使用。对于每个元素destructure date2
和date
,如果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;
答案 1 :(得分:1)
您可以将_orderBy与回调函数结合使用,该函数会检查date2
值是否存在{否} date
值。
这是你应该怎么做的:
_.orderBy(myObjects, function(o) {
return o.date2 ? o.date2 : o.date;
}, true);
<强>演示:强>
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;
您可以查看显示类似用例的 lodash orderBy on nested property 。