Один из подходов заключается в использовании метода Array#reduce()
для преобразования входного массива в словарь, где каждое значение содержит накопление идентификаторов для этого месяца и года. После того, как этот словарь был создан, вы можете извлечь значения этого словаря в массив с помощью Object#values()
, чтобы получить требуемый вывод:
let input=[{date:{day:27,month:1,year:2020},id:3},{date:{day:28,month:1,year:2020},id:4},{date:{day:31,month:1,year:2020},id:5},{date:{day:1,month:2,year:2020},id:6},{date:{day:2,month:2,year:2020},id:7}];
/* Convert the dictionary that will be created by reduce to a value array */
var output = Object.values(input.reduce((dict, item) => {
const { date, id } = item;
/* The distinct key for this item based on month/year of date field */
const key = `${date.month}-${date.year}`;
/* Check if dictionary already has an object value for key. This short hand
will only insert a new object value for key, if one does not already exist
in the dictionary */
const value = dict[key] || { month : date.month, year : date.year, id : [] };
/* Add the item id to the dictionary entries id array */
value.id.push(id);
/* Update value object for key */
return { ...dict, [key] : value };
}, {}))
console.log(output);
Идея состоит в том, что словарь построен с использованием составных ключей , где ключи получены из месяца и года текущего элемента массива.
Если для текущего ключа не существует значения, в словарь для этого ключа добавляется новый объект значения:
{ month : date.month, year : date.year, id : [] }
Затем добавляется id
текущего элемента массива ( ) к массиву id
объекта для этого ключа:
dict[key].id.push(id);
Надеюсь, что поможет