Объединить массив объектов с сортировкой по дате
У меня есть этот объект:
{
id: 1,
nums: 3,
dates: [
{
date: '21-10-2012',
promo: {
id: 1,
name: 'promo 1'
},
hours: [
{
hour: '22:00',
vision: {
id: 1,
name: '2D'
}
},
{
hour: '23:00',
vision: {
id: 2,
name: '3D'
}
}
]
},
{
date: '21-10-2012',
promo: {
id: 2,
name: 'promo 2'
},
hours: [
{
hour: '22:00',
vision: {
id: 2,
name: '3D'
}
}
]
},
{
date: '21-10-2013',
promo: {
id: 2,
name: 'nome promo'
},
hours: [
{
hour: '22:00',
vision: {
id: 2,
name: '3D'
}
}
]
}
]}
Я хочу объединить объект, который имеет одинаковое значение даты и переопределение промо и часов. Ниже есть результат, который я хочу:
{
id: 1,
nums: 3,
dates: [
{
date: '21-10-2012',
promo: {
id: 2,
name: 'promo 2'
},
hours: [
{
hour: '22:00',
vision: {
id: 2,
name: '3D'
}
},
{
hour: '23:00',
vision: {
id: 2,
name: '3D'
}
}
]
},
{
date: '21-10-2013',
promo: {
id: 2,
name: 'nome promo'
},
hours: [
{
hour: '22:00',
vision: {
id: 2,
name: '3D'
}
}
]
}
]}
Я пытался что-то сделать, но я не знаю, как точно:
obj.dates.reduce(function(acc, curr) {
if (new Date(acc.date).valueOf() === new Date(curr.date).valueOf()) {
acc.hours = acc.hours.reduce(function(acc, curr) {
return Object.assign(acc, curr);
});
}
return Object.assign(acc, curr);
}, {})
1 ответ
Решено! Надеюсь, это кому-нибудь пригодится!
let obj = {
id: 1,
nums: 3,
dates: [
{
rif: "2017-03-13T00:00:02.000Z",
date: '21-10-2012',
promo: {
id: 1,
name: 'promo 1'
},
hours: [
{
hour: '22:00',
vision: {
id: 1,
name: '2D'
}
},
{
hour: '23:00',
vision: {
id: 2,
name: '3D'
}
}
]
},
{
rif: "2017-03-13T00:00:03.000Z",
date: '21-10-2012',
promo: {
id: 2,
name: 'promo 2'
},
hours: [
{
hour: '22:00',
vision: {
id: 2,
name: '3D'
}
}
]
},
{
rif: "2017-03-13T00:00:02.000Z",
date: '21-10-2013',
promo: {
id: 2,
name: 'nome promo'
},
hours: [
{
hour: '27:00',
vision: {
id: 2,
name: '3D'
}
}
]
}
]
};
let res = [];
let dates = Array.from(new Set(obj.dates.map(x => x.date)));
dates.forEach(v => {
res.push(
obj.dates.filter(x => x.date === v)
.sort((a, b) => new Date(a.rif).getTime() - new Date(b.rif).getTime())
.reduce((acc, curr) => {
let hours = acc.hours.concat(curr.hours);
let newHours = [];
Array.from(new Set(hours.map(x => x.hour)))
.forEach(h => {
newHours.push(
hours.filter(x => x.hour === h)
.reduce((s, d) => Object.assign(s, d))
)
});
return Object.assign(acc, curr, { hours: newHours });
})
);
});
console.log(res);