如何拆分对象数组的data并补0至指定长度,匹配对应日期?
问题描述
给定如下结构的对象数组:
[{"data": [5, 2, 7, 2, 4, 2], "date": {"begin": "03.07.", "beginYear": "2023", "end": "10.07.", "endYear": "2023", "timestamp": 1688335200000}}, {"data": [5, 2, 7, 2, 4, 2], "date": {"begin": "26.06.", "beginYear": "2023", "end": "03.07.", "endYear": "2023", "timestamp": 1687730400000}}, {"data": [5, 2, 7, 2, 4, 2], "date": {"begin": "19.06.", "beginYear": "2023", "end": "26.06.", "endYear": "2023", "timestamp": 1687125600000}}, {"data": [5, 2, 7, 2, 4, 2], "date": {"begin": "12.06.", "beginYear": "2023", "end": "19.06.", "endYear": "2023", "timestamp": 1686520800000}}, {"data": [5, 2, 7, 2, 4, 2], "date": {"begin": "05.06.", "beginYear": "2023", "end": "12.06.", "endYear": "2023", "timestamp": 1685916000000}}, {"data": [5, 2, 7, 2, 4, 2], "date": {"begin": "29.05.", "beginYear": "2023", "end": "05.06.", "endYear": "2023", "timestamp": 1685311200000}}]
所有对象的data数组内容完全一致,需要实现以下逻辑:
- 检查
data数组长度是否超过4,若是则提取前4个元素,作为新对象的data值,该新对象的date使用原数组中最早的日期(即最后一个元素的date); - 将
data数组中剩余的元素组成新数组,补0至长度为4,作为另一个新对象的data值,该新对象的date使用原数组中从最早日期起第4周对应的日期(即原数组第2个元素的date); - 逻辑需支持
data数组包含更多元素的场景。
尝试编写的代码如下:
const fourStack = [] const firstFourItems = result.slice(0, 4) const restItems = result.slice(4) const firstItem = firstFourItems[0] const newData = firstFourItems.map((item) => item.data.slice(0, 4)) const newObj = { data: newData, date: { begin: firstItem.date.begin, beginYear: firstItem.date.beginYear, end: firstItem.date.end, endYear: firstItem.date.endYear, timestamp: firstItem.date.timestamp } } fourStack.push(newObj) restItems.forEach((item) => { fourStack.push({ data: item.data.slice(0, 4), date: { begin: newObj.date.begin, beginYear: newObj.date.beginYear, end: newObj.date.end, endYear: newObj.date.endYear, timestamp: newObj.date.timestamp } }) })
运行后得到不符合预期的错误结果:
[{"data": [[Array], [Array], [Array], [Array]], "date": {"begin": "03.07.", "beginYear": "2023", "end": "10.07.", "endYear": "2023", "timestamp": 1688335200000}}, {"data": [5, 2, 7, 2], "date": {"begin": "03.07.", "beginYear": "2023", "end": "10.07.", "endYear": "2023", "timestamp": 1688335200000}}, {"data": [5, 2, 7, 2], "date": {"begin": "03.07.", "beginYear": "2023", "end": "10.07.", "endYear": "2023", "timestamp": 1688335200000}}]
解决方案
错误原因分析
原代码核心问题:
- 错误对前4个对象的
data做map处理,导致第一个新对象的data变成二维数组,偏离了"提取单个data数组前4元素"的需求; - 误解需求逻辑,针对原对象数组做切片而非针对单个
data数组拆分,完全偏离核心目标。
正确实现代码
const processDataArray = (result) => { const fourStack = []; // 所有对象data内容一致,取第一个即可 const targetData = result[0].data; const dataLength = targetData.length; if (dataLength > 4) { // 逻辑1:提取前4个元素,对应原数组最后一个元素的日期(最早日期) const firstPart = targetData.slice(0, 4); fourStack.push({ data: firstPart, date: {...result[result.length - 1].date} // 浅拷贝避免引用修改 }); // 逻辑2:剩余元素补0至长度4,对应原数组第2个元素的日期 const restPart = targetData.slice(4); // 补0到长度4 while (restPart.length < 4) { restPart.push(0); } // 若剩余元素超过4,截取前4个保证符合长度要求 fourStack.push({ data: restPart.slice(0, 4), date: {...result[1].date} }); } return fourStack; }; // 调用示例 const result = [/* 你的原始对象数组 */]; const processedResult = processDataArray(result); console.log(processedResult);
逻辑说明
- 利用所有对象
data内容一致的特性,直接取第一个对象的data作为处理目标,减少冗余操作; - 检查
data长度是否大于4,满足条件则执行两步拆分:- 第一部分:截取
data前4个元素,日期绑定原数组最后一个元素的date(最早日期); - 第二部分:截取
data剩余元素,通过循环补0至长度4,日期绑定原数组第2个元素的date;
- 第一部分:截取
- 对日期对象做浅拷贝(
{...date}),避免后续修改原数组时影响新对象的日期属性; - 若
data剩余元素超过4,通过slice(0,4)截取前4个,确保最终data长度符合要求,兼容更多元素的场景。
内容的提问来源于stack exchange,提问作者SiHo
相关产品推荐
相关产品推荐

