You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分对象数组的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}}]
解决方案

错误原因分析

原代码核心问题:

  1. 错误对前4个对象的data做map处理,导致第一个新对象的data变成二维数组,偏离了"提取单个data数组前4元素"的需求;
  2. 误解需求逻辑,针对原对象数组做切片而非针对单个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);

逻辑说明

  1. 利用所有对象data内容一致的特性,直接取第一个对象的data作为处理目标,减少冗余操作;
  2. 检查data长度是否大于4,满足条件则执行两步拆分:
    • 第一部分:截取data前4个元素,日期绑定原数组最后一个元素的date(最早日期);
    • 第二部分:截取data剩余元素,通过循环补0至长度4,日期绑定原数组第2个元素的date;
  3. 对日期对象做浅拷贝({...date}),避免后续修改原数组时影响新对象的日期属性;
  4. 若data剩余元素超过4,通过slice(0,4)截取前4个,确保最终data长度符合要求,兼容更多元素的场景。

内容的提问来源于stack exchange,提问作者SiHo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:15:06