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

标签 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);
}, {})

最佳答案

解决了!希望它对某人有用!

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);

关于javascript - 合并按日期排序的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44869620/

相关文章:

java - 如何创建通用数组?

callback - 外来控制流的 ES6 Promise 模式

php - 如何用我自己的文本替换某些 PHP 值?

javascript - 使用正则表达式检查有效的日期组合?

javascript - 在 React 中切换 aria-pressed 角色以实现 Web 可访问性的最有效方法

javascript - 让我的文本框理解 html img 标签

通过将字符串转换为日期格式来对 Javascript 日期进行排序

Javascript "for of"在 IE 11 中失败

javascript - 如何从文件中导出多个对象

javascript - React 组件投票向上和向下