合并按日期排序的对象数组

时间:2017-07-02 10:07:47

标签: javascript arrays ecmascript-6 javascript-objects es5-shim

我有这个对象:

{
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 个答案:

答案 0 :(得分: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);