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

如何将一维数组转为嵌套数组并通过slice生成新数组(React)

实现方案:一维数组转嵌套数组并拆分合并(React Hooks版)

嘿,这需求我刚好做过类似的,给你一步步拆解实现:

1. 先把一维数组拆成9元素一组的嵌套数组

首先我们需要一个工具函数,把原始的一维数组按每9个元素分割成子数组。用reduce来实现最直观:

const chunkArray = (arr, chunkSize) => {
  return arr.reduce((result, item, index) => {
    const chunkIndex = Math.floor(index / chunkSize);
    if (!result[chunkIndex]) {
      result[chunkIndex] = []; // 如果当前组不存在,新建一个空数组
    }
    result[chunkIndex].push(item);
    return result;
  }, []);
};

比如传入Array.from({length:97}, (_,i)=>i)(生成0到96的数组),就能得到你要的data = [[0,1,...,8], [9,...,17], ..., [88,...,96]]结构。

2. 拆分每个子数组并合并到new_data1和new_data2

拿到嵌套数组后,遍历每个子数组,用slice截取前3个和后6个元素,分别合并到两个目标数组里。这里用forEach配合扩展运算符实现,代码简洁易懂:

const processData = (chunkedData) => {
  let newData1 = [];
  let newData2 = [];
  chunkedData.forEach(subArr => {
    // 截取前3个元素,合并到newData1
    newData1 = [...newData1, ...subArr.slice(0, 3)];
    // 截取从索引3到末尾(共6个元素),合并到newData2
    newData2 = [...newData2, ...subArr.slice(3, 9)];
  });
  return { newData1, newData2 };
};

如果原始子数组长度不足9,你可以把slice(3,9)改成slice(3),这样会自动截取从索引3到末尾的所有元素,适配边界情况。

3. React Hooks完整组件实现

把上面的逻辑结合React的useState和useEffect(或按钮触发)来管理状态,完整代码如下:

import { useState, useEffect } from 'react';

const DataProcessor = () => {
  // 初始化两个目标数组的状态
  const [newData1, setNewData1] = useState([]);
  const [newData2, setNewData2] = useState([]);

  // 模拟原始一维数组(你可以替换成自己的业务数据)
  const originalArray = Array.from({ length: 97 }, (_, i) => i);

  // 拆分数组的工具函数
  const chunkArray = (arr, chunkSize) => {
    return arr.reduce((result, item, index) => {
      const chunkIndex = Math.floor(index / chunkSize);
      if (!result[chunkIndex]) {
        result[chunkIndex] = [];
      }
      result[chunkIndex].push(item);
      return result;
    }, []);
  };

  // 处理数据并更新状态的核心函数
  const handleProcessData = () => {
    const chunkedData = chunkArray(originalArray, 9);
    let tempData1 = [];
    let tempData2 = [];
    chunkedData.forEach(subArr => {
      tempData1 = [...tempData1, ...subArr.slice(0, 3)];
      tempData2 = [...tempData2, ...subArr.slice(3, 9)];
    });
    // 更新React状态
    setNewData1(tempData1);
    setNewData2(tempData2);
  };

  // 组件挂载时自动处理数据(也可以改成按钮点击触发)
  useEffect(() => {
    handleProcessData();
  }, []);

  return (
    <div className="data-container">
      <h3>new_data1 结果:</h3>
      <pre>{JSON.stringify(newData1, null, 2)}</pre>
      <h3>new_data2 结果:</h3>
      <pre>{JSON.stringify(newData2, null, 2)}</pre>
    </div>
  );
};

export default DataProcessor;

类组件版本(如果用setState)

要是你还在使用React类组件,逻辑完全一致,只是把状态管理换成this.state和this.setState:

import React, { Component } from 'react';

class DataProcessor extends Component {
  state = {
    newData1: [],
    newData2: []
  };

  chunkArray = (arr, chunkSize) => {
    return arr.reduce((result, item, index) => {
      const chunkIndex = Math.floor(index / chunkSize);
      if (!result[chunkIndex]) {
        result[chunkIndex] = [];
      }
      result[chunkIndex].push(item);
      return result;
    }, []);
  };

  handleProcessData = () => {
    const originalArray = Array.from({ length: 97 }, (_, i) => i);
    const chunkedData = this.chunkArray(originalArray, 9);
    let tempData1 = [];
    let tempData2 = [];
    chunkedData.forEach(subArr => {
      tempData1 = [...tempData1, ...subArr.slice(0, 3)];
      tempData2 = [...tempData2, ...subArr.slice(3, 9)];
    });
    this.setState({ newData1: tempData1, newData2: tempData2 });
  };

  componentDidMount() {
    this.handleProcessData();
  }

  render() {
    const { newData1, newData2 } = this.state;
    return (
      <div className="data-container">
        <h3>new_data1 结果:</h3>
        <pre>{JSON.stringify(newData1, null, 2)}</pre>
        <h3>new_data2 结果:</h3>
        <pre>{JSON.stringify(newData2, null, 2)}</pre>
      </div>
    );
  }
}

export default DataProcessor;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 07:37:37