如何提取按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>
请问如何完成后续的元素提取与合并操作?
解决方案
你可以通过以下步骤完成合并操作:
- 提取所有IP对应的分块数组集合;
- 确定结果数组的最大长度(取所有IP分块数组中最长的长度);
- 遍历每个位置索引,将所有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
相关产品推荐
相关产品推荐

