Javascript 按近期日期对对象数组进行分组

Javascript group array of object by near dates

我不明白如何在时间轴内对对象数组进行分组。

让我解释一下,

时间线是根据一系列日期创建的,从开始日期算起超过 90 年。

const timeline = [
    {
        year: '2015',
        items: []
    },
    {
        year: '2016',
        items: []
    }
];

timeline.items 中,我必须推送来自另一个对象数组的其他项目, timelineItems

const timelineItems = [
    {
        year: '2015',
        somedata:'somevalue'
    },
    {
        year: '2016',
        somedata:'somevalue'
    }
];

在某些情况下,我必须根据 timeline.yeartimlineItems.year

这是预期的结果

const timeline = [{
        year: '2015',
        items: [{
                year: '2015',
                somedata: 'somevalue'
            },
            {
                year: '2016',
                somedata: 'somevalue'
            }
        ]
    },
    {
        year: '2016',
        items: []

    }
];

我正在尝试使用一个函数映射 timeline.items,该函数检查发现的第一年和接下来的 3 年之间的差异,但我遇到了一些问题。 我还是不明白该怎么做。

我已经 https://jsfiddle.net/ghmtL8cf/ 使用初始数据和一些注释来帮助理解所需的输出。

更新

感谢@Nur 的回答,我能够执行第一个分组。

This is the link 具有更多输入和预期输出的更新后的 jsfiddle。

在预期的输出中,我希望仅当第一个 timelineItems 等于实际时间线年份时才应用分组。

看着这个问题我想补充一个想法。

我们是否应该将时间线分成 3 个块,并为每个块添加等于块年份开始结束的 timelineItems?

提前致谢

这是一个棘手的问题 problem.At 首先检查 timelineItems 是否存在于 timelineRef,如果不存在则创建一个 ref 并将项目推入 timeline,否则从 timelineRef 中找到 timeline 然后推送项目并继续循环...,

应该可以解决你的问题,而且超级高效!

let timeline = [{ year: '2015', items: [] }, { year: '2016', items: [] }, { year: '2019', items: [] }, { year: '2023', items: [] }, { year: '2024', items: [] }, { year: '2025', items: [] }, { year: '2026', items: [] }],
    timelineItems = [{ year: '2015', somedata: 'somevalue' }, { year: '2016', somedata: 'somevalue' }, { year: '2019', somedata: 'somevalue' }, { year: '2023', somedata: 'somevalue' }, { year: '2024', somedata: 'somevalue' }, { year: '2025', somedata: 'somevalue' }];

function group(timeline, timelineItems) {
    const timelineRef = [];
    loop: for (const item of timelineItems) {
        for (const { year, items } of timelineRef)
            if (year < item.year && item.year < year + 3) {
                items.push(item);
                continue loop;
            }

        for (const { year, items } of timeline) {
            if (year != item.year) continue;
            items.push(item);
            timelineRef.push({ year: Number(year), items });
            break;
        }
    }
    return timeline;
}
console.log(group(timeline, timelineItems));

祝黑客愉快...