сгруппировать по дате в Javascript - PullRequest
3 голосов
/ 19 мая 2019

У меня есть массив дней рождения

const birthdays = [
    {name: 'John', birthday: '08-08-1960'},
    {name: 'James', birthday: '08-25-1960'},
    {name: 'Mary', birthday: '01-01-1990'},
]

, и мне нужно создать новый массив с днями рождения, сгруппированными по месяц-год

const grouped = [
    {'08-1960': [
        {name: 'John', birthday: '08-08-1960'},
        {name: 'James', birthday: '08-25-1960'},        
    ]},
    {'01-1990': [
        {name: 'Mary', birthday: '01-01-1990'}, 
    ]},
]

Iсмотрел на что-то вроде этого.используя moment и lodash

let groupedResults = _.groupBy(results, (result) => moment(result['Date'], 'DD/MM/YYYY').startOf('isoWeek'));

, но я не могу представить, как сгенерировать новую структуру массива (с ключом месяц-год), спасибо.

обновление: должно возвращать массив, а не объект: facepalm

Ответы [ 2 ]

4 голосов
/ 19 мая 2019

Вы можете использовать reduce()

  • Применить reduce() к массиву объекта и установить аккумулятор на пустой объект {}
  • Тогда split() день рождения -и получить только получить первый и третий элемент.
  • Если ключ существует, это аккумулятор, который concat() добавляет ему новое значение.В противном случае concat() это пустой массив [], а затем установить его как свойство аккумулятора.

const arr = [
    {name: 'John', birthday: '08-08-1960'},
    {name: 'James', birthday: '08-25-1960'},
    {name: 'John', birthday: '01-01-1990'},
]

let res = arr.reduce((ac,a) => {
 let key = a.birthday.split('-');
 key = `${key[0]}-${key[2]}`;
 ac[key] = (ac[key] || []).concat(a);
 return ac;
},{})
res = Object.entries(res).map(([k,v]) => ({[k]:v}))
console.log(res)
0 голосов
/ 19 мая 2019

Как объяснено здесь https://www.dyn -web.com / javascript / arrays / associative.php вы можете создавать массивы, где индексы являются строками, но я не буду работать как обычный массив.

Вот фрагмент для выполнения того, что вы хотите.

    const birthdays = [
        {name: 'John', birthday: '08-08-1960'},
        {name: 'James', birthday: '08-25-1960'},
        {name: 'Mary', birthday: '01-01-1990'},
    ];

    const grouped = birthdays.reduce((prev, cur) => {

    	const date = new Date(cur.birthday);
    	const key = `${(date.getMonth() + 1)}-${date.getFullYear()}`;

    	if(!prev[key]){
    		prev[key] = [ cur ];
        }
    	else{
    		prev[key].push(cur);
        }

    	return prev;
    }, []);

    for(let i in grouped){
      console.log(grouped[i]);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...