如果日期相同,则按日期排序对象数组,然后按字符串值排序

时间:2018-05-11 11:05:53

标签: javascript sorting lodash

我有一个对象数组:

arr = [
        {
            name : 'Gary',
            DOB : '01/01/1980',
            importance: 'High'
        },
        {
            name : 'Bill',
            DOB : '01/01/1985',
            importance: 'High'
        },
        {
            name : 'Joe',
            DOB : '01/01/1981',
            importance: 'Medium'
        },
        {
            name : 'Phillip',
            DOB : '01/01/1981',
            importance: 'High'
        },
        {
            name : 'Ed',
            DOB : '01/01/1980',
            importance: 'Low'
        },
        {
            name : 'Nix',
            DOB : '01/01/1980',
            importance: 'High'
        },
        {
            name : 'Pat',
            DOB : '01/01/1980',
            importance: 'Low'
        }
    ]

我按两个字段排序这些人,首先是DOB,如果他们有相同的DOB,那么按importance,从低到高,在顶部和高处低在底部。

我可以很容易地比较他们的日期,但在此之后我很难按其重要性排序?

有人可以提供任何建议吗?

var importanceOrder = ['Low', 'Normal', 'High'];

arr.sort(function(a, b) {
    if(a.dueDate.value != b.dueDate.value){
        return a.dueDate.value < b.dueDate.value ? -1 : 1;
    } else {
    //??
    }
});

2 个答案:

答案 0 :(得分:2)

您可以为imortance的排序顺序获取一个对象,并获取一个获取ISO日期的函数。

&#13;
&#13;
const getISO = s => s.replace(/(..)\/(..)\/(....)/, '$3-$1-$2');

var array = [{ name: 'Gary', DOB: '01/01/1980', importance: 'High' }, { name: 'Bill', DOB: '01/01/1985', importance: 'High' }, { name: 'Joe', DOB: '01/01/1981', importance: 'Medium' }, { name: 'Phillip', DOB: '01/01/1981', importance: 'High' }, { name: 'Ed', DOB: '01/01/1980', importance: 'Low' }, { name: 'Nix', DOB: '01/01/1980', importance: 'High' }, { name: 'Pat', DOB: '01/01/1980', importance: 'Low' }],
    order = { Low: 1, Normal: 2, High: 3 };


array.sort((a, b) => getISO(a.DOB).localeCompare(getISO(b.DOB)) || order[a.importance] - order[b.importance]);

console.log(array);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 1 :(得分:-1)

好的,这非常简单,首先检查日期是否不同并按照这种方式对它们进行排序,然后如果它们相等(x - x == 0将在第一个等式中返回false)检查它们的重要性,这很容易: )

arr.sort((a, b) => new Date(a.DOB) - new Date(b.DOB) || importanceOrder.indexOf(a.importance) - importanceOrder.indexOf(b.importance))