У меня есть несортированный массив объектов с двумя замечательными свойствами: type и date.
Мне нужно отсортировать этот массив:
deposit, а потом withdrawal)Вот пример ввода:
let i = [
{
date:'2017',
type:'withdrawal',
amount:-5
},
{
date:'2016',
type:'deposit',
amount:12
},
{
date:'2018',
type:'deposit',
amount:54
},
{
date:'2017',
type:'deposit',
amount:20
},
{
date:'2016',
type:'withdrawal',
amount:55
},
{
date:'2018',
type:'withdrawal',
amount:54
}
]
Цель состоит в том, чтобы вывести что-то вроде этого:
let o = [
{
date:'2016',
type:'deposit',
amount:12
},
{
date:'2016',
type:'withdrawal',
amount:55
},
{
date:'2017',
type:'deposit',
amount:20
},
{
date:'2017',
type:'withdrawal',
amount:-5
},
{
date:'2018',
type:'deposit',
amount:54
},
{
date:'2018',
type:'withdrawal',
amount:54
}
]
Пока мне удалось отсортировать массив по дате, используя:
o = i.sort((a,b)=>(a.date - b.date))
Но я не могу найти способ отсортировать его по типу



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать «сортировку», как показано ниже. Используя localeCompare, он будет отсортировать «тип» в порядке возрастания - то есть «депозит» будет стоять перед «снятием», поскольку «d» стоит перед «w».
Вот и используйте это -
i.sort((a,b) => ((+a.date) - (+b.date) || (a.type.localeCompare(b.type))))
let i = [
{
date:'2017',
type:'withdrawal',
amount:-5
},
{
date:'2016',
type:'deposit',
amount:12
},
{
date:'2018',
type:'deposit',
amount:54
},
{
date:'2017',
type:'deposit',
amount:20
},
{
date:'2016',
type:'withdrawal',
amount:55
},
{
date:'2018',
type:'withdrawal',
amount:54
}
]
i.sort((a,b) => ((+a.date) - (+b.date) || (a.type.localeCompare(b.type))))
console.info(i)@TSR Я добавил объяснение типа "сортировка" .. Пожалуйста, дайте мне знать, если что-то неясно. Спасибо.
Вы можете использовать string#localCompare для сортировки массива сначала по date, а затем по type.
let arr = [ { date:'2017', type:'withdrawal', amount:-5 }, { date:'2016', type:'deposit', amount:12 }, { date:'2018', type:'deposit', amount:54 }, { date:'2017', type:'deposit', amount:20 }, { date:'2016', type:'withdrawal', amount:55 }, { date:'2018',type:'withdrawal', amount:54 } ];
arr.sort((a,b) => a.date.localeCompare(b.date) || a.type.localeCompare(b.type));
console.info(arr);Хотя это, вероятно, не самое оптимальное решение, я объединил тип с датой в виде строки для «a» и «b» в методе Array.prototype.sort и отсортировал массив на основе этого.
i.sort((a,b) => {
let aStr = `${a.date}${a.type}`;
let bStr = `${b.date}${b.type}`;
if (aStr > bStr) {
return 1;
} else if (aStr === bStr) {
return 0;
} else {
return -1;
}
});
Надеюсь, это поможет!
Не могли бы вы объяснить