Сортировать массив javascript объекта по атрибуту - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть несортированный массив объектов, обладающий двумя свойствами: 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))

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

Ответы [ 3 ]

0 голосов
/ 17 ноября 2018

Вы можете использовать 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.log(arr);
0 голосов
/ 17 ноября 2018

Хотя это, вероятно, не самое оптимальное решение, я конкатенировал тип на дату в виде строки для «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;
  }
});

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

0 голосов
/ 17 ноября 2018

Вы можете использовать «сортировку», как показано ниже. Используя "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.log(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...