javascript或jquery 如何按照要求处理下面数组并输出

思否 问答 已采纳 👍 2 含 AI 优化版

问题

javascript或jquery 如何按照要求处理下面数组并输出

在 SegmentFault 查看原问题 →

由大模型辅助整理,保留原意,优化结构与可读性。

问题概述

提问者给出一组具有重复规律的数组(如 [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

评论

评论功能即将开放。你也可以通过 邮件GitHub Issue 反馈。