[英]Javascript group array of object by near dates
我不明白如何在時間軸內對一組 object 進行分組。
讓我解釋,
時間線是從一系列日期創建的,從開始日期起達到 +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: []
}
];
我正在嘗試使用 function 對時間線.項目進行 map 檢查發現的第一年與接下來的 3 年之間的差異,但我遇到了一些問題。 我仍然不明白如何做到這一點。
我用初始數據和一些評論制作了這個https://jsfiddle.net/ghmtL8cf/以幫助理解所需的 output。
更新
感謝@Nur 的回答,我能夠執行第一個分組。
這是更新的 jsfiddle 的鏈接,具有更多輸入和預期的 output。
在預期的 output 中,我希望僅當第一個時間線項等於實際時間線年份時才應用分組。
看着這個問題,我想添加另一個想法。
我們是否應該將時間線拆分為 3 的塊,並為每個塊添加等於塊年開始結束的時間線項?
提前致謝
這是一個棘手的問題。首先檢查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));
快樂的黑客...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.