javascript或jquery 如何按照要求处理下面数组并输出
问题
javascript或jquery 如何按照要求处理下面数组并输出
由大模型辅助整理,保留原意,优化结构与可读性。
问题概述
提问者给出一组具有重复规律的数组(如 [1,1,2,2,3,3,4,4,5,5]),期望将其转换为另一种排列方式(如 [1,2,3,4,5,1,2,3,4,5]),并希望找到通用的转换算法,而不是针对某一个具体数组硬编码。
涉及技术
JavaScript、数组、Set、reduce
期望结果
希望得到一个能够适应任意「重复次数」「独立元素个数」组合的通用转换公式或实现代码。
回答
原始回答
[1,1,2,2,3,3,4,4,5,5]
[1,2,3,4,5,1,2,3,4,5]
你的值对照关系,转换成下标对照如下
[0,1,2,3,4,5,6,7,8,9]
[0,5,1,6,2,7,3,8,4,9]
由上面的似乎可以得出奇数偶数位递增,我们扩展到3找寻规律。
[1,1,1,2,2,2,3,3,3,4,4,4,5,5,5]
[1,2,3,4,5,1,2,3,4,5,1,2,3,4,5]
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
[0,5,10,1,6,11,...]
从这里我们似乎就找到了两个东西,这俩个东西是描述我们数组的。
// 独立个数
var size = new Set([1,2,3,4,5,1,2,3,4,5]).size
// 独立个数重复次数
var repeatSize = arr.length / size
然后就是规律生成了
var arr = [1,1,2,2,3,3,4,4,5,5]
var size = new Set(arr).size
var repeatSize = arr.length / size
arr.reduce((s,n,idx,arr)=>{
s[(idx % repeatSize) * size + (idx / repeatSize)>>0] = n
return s
},[])
扩展到其他规则下也是对的
AI 优化 · 回答整理
解答思路
把值的对照关系转换成下标的对照关系来观察规律:先统计数组中「独立元素个数」(用 Set 去重后的大小)和「每个元素重复的次数」,再用这两个数值推导出一个下标映射公式,最后通过 reduce 按照该公式重新排列数组。
示例代码
var arr = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5];
// 独立个数
var size = new Set(arr).size;
// 独立个数重复次数
var repeatSize = arr.length / size;
var result = arr.reduce((s, n, idx, arr) => {
s[(idx % repeatSize) * size + ((idx / repeatSize) >> 0)] = n;
return s;
}, []);
详细说明
先从具体例子中找规律:
值: [1,1,2,2,3,3,4,4,5,5]
目标: [1,2,3,4,5,1,2,3,4,5]
下标: [0,1,2,3,4,5,6,7,8,9]
目标下标对照:[0,5,1,6,2,7,3,8,4,9]
把重复次数从 2 扩展到 3([1,1,1,2,2,2,3,3,3,4,4,4,5,5,5] → [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5]),可以进一步验证下标之间存在的规律,从中提炼出两个关键量:
size:数组中独立元素的个数(用new Set(arr).size求得)。repeatSize:每个独立元素重复的次数(等于arr.length / size)。
有了这两个量,就能推导出原下标 idx 到目标下标的映射公式:
目标下标 = (idx % repeatSize) * size + Math.floor(idx / repeatSize)
再用 reduce 遍历原数组,把每个元素按这个公式放到新数组的对应位置上,就完成了转换。这个公式不依赖具体的重复次数或元素个数,因此对任意「N 个元素各重复 M 次」的同类数组都适用。
小结
处理这类有规律的重复数组转换问题,关键是先把值的对照关系抽象成下标的对照关系,再用「独立元素个数」和「重复次数」这两个变量推导出通用下标映射公式,最后用 reduce 完成重排,该方法可扩展到任意重复次数的场景。
由大模型辅助整理,保留原意,补充结构与代码格式。
回答转载自 SegmentFault