Упорядочить массив по значениям внутри его объектов и дате - PullRequest
0 голосов
/ 29 мая 2019

У меня есть такой массив:

[{
Animal:{Tag:1, Eats:"Grass"},
Color:{Id:1, ColorName: "Black",
DateAndTime:"2019-06-06T13:45:00"
},
{
Animal:{Tag:2, Eats:"Meat"},
Color:{Id:2, ColorName: "Brown",
DateAndTime:"2019-06-07T13:45:00"
},
{
Animal:{Tag:3, Eats:"Water"},
Color:{Id:3, ColorName: "White",
DateAndTime:"2019-06-06T11:45:00"
},
{
Animal:{Tag:4, Eats:"Grass"},
Color:{Id:4, ColorName: "Yellow",
DateAndTime:"2019-06-06T14:45:00"
}]

Я хочу упорядочить его таким образом, чтобы он сначала был упорядочен «Eats», а внутри них он должен быть упорядочен «DateAndTime».Итак, в идеале он должен возвращаться так:

[{
Animal:{Tag:1, Eats:"Grass"},
Color:{Id:1, ColorName: "Black",
DateAndTime:"2019-06-06T13:45:00"
}
,
{
Animal:{Tag:4, Eats:"Grass"},
Color:{Id:4, ColorName: "Yellow",
DateAndTime:"2019-06-06T14:45:00"
},
{
Animal:{Tag:3, Eats:"Meat"},
Color:{Id:3, ColorName: "White",
DateAndTime:"2019-06-06T11:45:00"
},
{
Animal:{Tag:2, Eats:"Meat"},
Color:{Id:2, ColorName: "Brown",
DateAndTime:"2019-06-07T13:45:00"
}]

Используя lodash, я смог упорядочить его по DateAndTime, но сначала я не смог упорядочить его по «Eats».Любая помощь будет оценена.Спасибо!

1 Ответ

1 голос
/ 29 мая 2019

Вы можете использовать string#localeCompare для сортировки массива сначала по полям Eats, а затем по DateAndTime.

let data = [{ Animal:{Tag:1, Eats:"Grass"}, Color:{Id:1, ColorName: "Black"}, DateAndTime:"2019-06-06T13:45:00" }, { Animal:{Tag:2, Eats:"Meat"}, Color:{Id:2, ColorName: "Brown"}, DateAndTime:"2019-06-07T13:45:00" }, { Animal:{Tag:3, Eats:"Water"}, Color:{Id:3, ColorName:"White"}, DateAndTime:"2019-06-06T11:45:00" }, { Animal:{Tag:4, Eats:"Grass"}, Color:{Id:4, ColorName: "Yellow"}, DateAndTime:"2019-06-06T14:45:00" }];
data.sort((a,b) => a.Animal.Eats.localeCompare(b.Animal.Eats) || a.DateAndTime.localeCompare(b.DateAndTime));
console.log(data);
.as-console-wrapper {max-height: 100% !important; top: 0;}

Вы можете использовать lodash#sortBy для сортировки данных.

let data = [{ Animal:{Tag:1, Eats:"Grass"}, Color:{Id:1, ColorName: "Black"}, DateAndTime:"2019-06-06T13:45:00" }, { Animal:{Tag:2, Eats:"Meat"}, Color:{Id:2, ColorName: "Brown"}, DateAndTime:"2019-06-07T13:45:00" }, { Animal:{Tag:3, Eats:"Water"}, Color:{Id:3, ColorName:"White"}, DateAndTime:"2019-06-06T11:45:00" }, { Animal:{Tag:4, Eats:"Grass"}, Color:{Id:4, ColorName: "Yellow"}, DateAndTime:"2019-06-06T14:45:00" }],
    result = _.sortBy(data, ['Animal.Eats', 'DateAndTime']);
console.log(result);
.as-console-wrapper {max-height: 100% !important; top: 0;}
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
...