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.year 和 timlineItems.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));
祝黑客愉快...
我不明白如何在时间轴内对对象数组进行分组。
让我解释一下,
时间线是根据一系列日期创建的,从开始日期算起超过 90 年。
const timeline = [
{
year: '2015',
items: []
},
{
year: '2016',
items: []
}
];
在 timeline.items 中,我必须推送来自另一个对象数组的其他项目, timelineItems
const timelineItems = [
{
year: '2015',
somedata:'somevalue'
},
{
year: '2016',
somedata:'somevalue'
}
];
在某些情况下,我必须根据 timeline.year 和 timlineItems.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));
祝黑客愉快...