У меня есть массив объектов, содержащих ключ "год" и ключ "дата", например:
var fullDates = [
{ 'year': '2018', date: '2018-01'},
{ 'year': '2017', date: '2017-02'},
{ 'year': '2016', date: '2016-03'},
{ 'year': '2018', date: '2018-04'},
{ 'year': '2017', date: '2017-05' },
{ 'year': '2016', date: '2016-06'}
];
Я хочу создать новый массив объектов, содержащих год и даты, но где ключ "дата" - это массив, как показано ниже. Как я могу это сделать?
var final = [
{ 'year': '2018', date: ['2018-01', '2018-02']},
{ 'year': '2017', date: ['2017-03', '2017-04']},
{ 'year': '2016', date: ['2016-04', '2016-06']}
]
Вы можете использовать Array.reduce()
для получения этого вывода:
var fullDates = [
{ 'year': '2018', date: '2018-01'},
{ 'year': '2017', date: '2017-02'},
{ 'year': '2016', date: '2016-03'},
{ 'year': '2018', date: '2018-04'},
{ 'year': '2017', date: '2017-05' },
{ 'year': '2016', date: '2016-06'}
];
var final = fullDates.reduce((acc, obj)=>{
var existingObj = acc.find(item => item.year === obj.year);
if(existingObj){
existingObj.date.push(obj.date);
return acc;
}
obj.date = [obj.date];
acc.push(obj);
return acc;
}, []);
console.log(final);
Вы можете использовать array#reduce
.
За каждый год, создать object
, содержащий year
и dates
свойства и для каждого повторяющегося year
добавить date
в array
. Затем получите все значения из этого аккумулятора object
.
const fullDates = [ { 'year': '2018', date: '2018-01'}, { 'year': '2017', date: '2017-02'}, { 'year': '2016', date: '2016-03'}, { 'year': '2018', date: '2018-04'}, { 'year': '2017', date: '2017-05' }, { 'year': '2016', date: '2016-06'} ],
result = Object.values(fullDates.reduce((r, {year, date}) => {
r[year] = r[year] || {year, dates : []};
r[year].dates.push(date);
return r;
},{}));
console.log(result);
Надеюсь это поможет:
var fullDates = [
{ 'year': '2018', date: '2018-01'},
{ 'year': '2017', date: '2017-02'},
{ 'year': '2016', date: '2016-03'},
{ 'year': '2018', date: '2018-04'},
{ 'year': '2017', date: '2017-05' },
{ 'year': '2016', date: '2016-06'}
];
const reducer = (accumulator, currentValue) => {
let yearData = accumulator.find(x => x.year == currentValue.year);
if(yearData !== undefined){
yearData.date.push(currentValue.date);
}
else{
accumulator.push({ 'year': currentValue.year, date: [currentValue.date]});
}
return accumulator;
}
var final = fullDates.reduce(reducer, []);
fullDates
когда вы создаете новый объект, так что это добавит сложности, если в объекте много свойств.