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

如何提取按IP分组数组的对应位置元素并合并?

问题

我需要提取按IP分组后的数组中,每个IP组的第1个子数组合并为新数组的第1项,第2个子数组合并为新数组的第2项,以此类推直至所有子数组处理完毕。

给定的按IP分组数组如下:

{"ip1.x.x.x": [
    [
      {"coin": "coin1"},
      {"coin": "coin2"},
      {"coin": "coin3"},
      {"coin": "coin4"},
      {"coin": "coin5"}
    ],
    [
      {"coin": "coin6"},
      {"coin": "coin7"},
      {"coin": "coin8"},
      {"coin": "coin9"}
    ]
  ],
  "ip2.x.x.x": [
    [
      {"coin": "coin10"},
      {"coin": "coin11"},
      {"coin": "coin12"},
      {"coin": "coin13"},
      {"coin": "coin14"}
    ],
    [
      {"coin": "coin15"},
      {"coin": "coin16"}
    ]
  ],
  "ip3.x.x.x": [
    [
      {"coin": "coin17"},
      {"coin": "coin18"},
      {"coin": "coin19"},
      {"coin": "coin20"},
      {"coin": "coin21"}
    ],
    [
      {"coin": "coin22"},
      {"coin": "coin23"},
      {"coin": "coin24"}
    ]
  ],
  etc..
}

期望得到的结果为:

[
  [
    {"coin": "coin1"},
    {"coin": "coin2"},
    {"coin": "coin3"},
    {"coin": "coin4"},
    {"coin": "coin5"},
    {"coin": "coin10"},
    {"coin": "coin11"},
    {"coin": "coin12"},
    {"coin": "coin13"},
    {"coin": "coin14"},
    {"coin": "coin17"},
    {"coin": "coin18"},
    {"coin": "coin19"},
    {"coin": "coin20"},
    {"coin": "coin21"}
  ],
  [
    {"coin": "coin6"},
    {"coin": "coin7"},
    {"coin": "coin8"},
    {"coin": "coin9"},
    {"coin": "coin15"},
    {"coin": "coin16"},
    {"coin": "coin22"},
    {"coin": "coin23"},
    {"coin": "coin24"}
  ]
]

我已通过以下代码实现了将每个IP下的数组按5个元素分块,得到了按IP分组的分块数组,但无法完成后续提取对应位置子数组合并的步骤:

const chunkArray = (array, chunkSize) => {
  return Array.from({
      length: Math.ceil(array.length / chunkSize)
    }, (_, index) =>
    array.slice(index * chunkSize, (index + 1) * chunkSize)
  );
};

let data_in_chunks_array = [];
let data_obj = {};

for (let i = 0; i < Object.keys(groupedByIp).length; i++) {
  const ip = Object.keys(groupedByIp)[i];

  let data_in_chunks_ip = chunkArray(groupedByIp[ip], 5);

  data_obj[ip] = data_in_chunks_ip;
}

console.log('data_obj', data_obj);
<script>
  let groupedByIp = {
    'ip1.x.x.x': [{
        coin: 'coin1',
      },
      {
        coin: 'coin2',
      },
      {
        coin: 'coin3',
      },
      {
        coin: 'coin4',
      },
      {
        coin: 'coin5',
      },
      {
        coin: 'coin6',
      },
      {
        coin: 'coin7',
      },
      {
        coin: 'coin8',
      },
      {
        coin: 'coin9',
      },
    ],
    'ip2.x.x.x': [{
        coin: 'coin10',
      },
      {
        coin: 'coin11',
      },
      {
        coin: 'coin12',
      },
      {
        coin: 'coin13',
      },
      {
        coin: 'coin14',
      },
      {
        coin: 'coin15',
      },
      {
        coin: 'coin16',
      },
    ],
    'ip3.x.x.x': [{
        coin: 'coin17',
      },
      {
        coin: 'coin18',
      },
      {
        coin: 'coin19',
      },
      {
        coin: 'coin20',
      },
      {
        coin: 'coin21',
      },
      {
        coin: 'coin22',
      },
      {
        coin: 'coin23',
      },
      {
        coin: 'coin24',
      },
    ],
  };
</script>

请问如何完成后续的元素提取与合并操作?


解决方案

你可以通过以下步骤完成合并操作:

  1. 提取所有IP对应的分块数组集合;
  2. 确定结果数组的最大长度(取所有IP分块数组中最长的长度);
  3. 遍历每个位置索引,将所有IP分块数组中对应索引的子数组合并到结果数组的对应项中。

具体代码实现

// 提取所有IP的分块数组
const allChunkedArrays = Object.values(data_obj);

// 计算结果数组的最大长度
const maxChunkCount = Math.max(...allChunkedArrays.map(arr => arr.length));

// 初始化结果数组并完成合并
const result = [];
for (let i = 0; i < maxChunkCount; i++) {
  // 收集所有IP中第i个子数组,无对应子数组则用空数组兜底
  const mergedChunk = allChunkedArrays.flatMap(ipChunks => ipChunks[i] || []);
  result.push(mergedChunk);
}

console.log('最终合并结果', result);

也可以用更简洁的链式写法:

const result = Array.from(
  { length: Math.max(...Object.values(data_obj).map(arr => arr.length)) },
  (_, index) => Object.values(data_obj).flatMap(ipChunks => ipChunks[index] || [])
);

代码说明

  • Object.values(data_obj):将按IP分组的分块数组转换为二维数组集合,格式为[[[coin1,...], [coin6,...]], [[coin10,...], [coin15,...]], ...];
  • Math.max(...allChunkedArrays.map(arr => arr.length)):确保结果数组能覆盖所有IP的分块位置,避免遗漏;
  • flatMap(ipChunks => ipChunks[i] || []):遍历每个IP的分块数组,取出对应索引的子数组,无对应子数组时用空数组替代,flatMap会自动展开并合并这些子数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:33:12