Сортировка массива объекта javascript по атрибуту

У меня есть несортированный массив объектов с двумя замечательными свойствами: type и date. Мне нужно отсортировать этот массив:

  1. По дате и
  2. По типу (для каждого года сначала должен идти 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))

Но я не могу найти способ отсортировать его по типу

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
75
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать «сортировку», как показано ниже. Используя localeCompare, он будет отсортировать «тип» в порядке возрастания - то есть «депозит» будет стоять перед «снятием», поскольку «d» стоит перед «w».

Вот и используйте это -

i.sort((a,b) => ((+a.date) - (+b.date) || (a.type.localeCompare(b.type))))
  • сначала вы сортируете по «дате», и если даты совпадают, тогда выполняется условие ИЛИ (поскольку a.date - b.date будет 0), чтобы проверить «тип»

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 17.11.2018 07:41

@TSR Я добавил объяснение типа "сортировка" .. Пожалуйста, дайте мне знать, если что-то неясно. Спасибо.

Nitish Narang 17.11.2018 07:45

Вы можете использовать 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;
  }
});

Надеюсь, это поможет!

Другие вопросы по теме