Js实现数组转二维数组两两组合
原数组
var arr=['a','b','c','d','e','f'];期望新的二维数组
[['a','b'],['c','d'],['e','f']]解法1: 索引填充
const arr = ['a','b','c','d','e','f'];
//数学计算,索引满足等差数列
const newArr = Array.from({ length: arr.length/2 }).map( (item, i) => [arr[2*(i)], arr[2*(i+1)-1]]);解法2: 正则匹配
const arr = ['a','b','c','d','e','f'];
const newArr = JSON.stringify(arr).match(/"(.*?)","(.*?)"/g).map(x => {
//过滤一下分组后的item
return x.replace(/"(.*?)"/g, '$1').split(',')
});解法3:增量分割
const arr = ['a', 'b', 'c', 'd', 'e', 'f'];
const newArr = arr.reduce( (acc, cur, i) => {
// (1) 初次调用的返回值acc为初始值 [],它是一个数组,所以将 cur 元素合并进去(入栈)
// (2) 如果acc的栈顶依然是个数组,而不是字符串,就将 cur 元素合并进去(入栈后其实整个acc是一个数组和字符串的混合模式)
if (acc.length === 0 || Array.isArray( acc.at(-1) ) ) {
return [...acc, cur];
}
//取出栈顶元素,组合成一个新的二维数组(完成分组)
const lastVal = acc.pop();
return [...acc, [lastVal, cur]];
}, []);解法4:减量分割
const arr = ['a', 'b', 'c', 'd', 'e', 'f'];
const newArr = arr.map( (item, i) => {
if ( i < 2 ) arr.push(null); //由于每次减少两个元素,最终结果想要循环 arr.length/2 次,就需要在末尾处增加2个空元素
return arr.splice(0, 2); //每次减少两个元素并覆盖原数组
}).filter( x => x !== null );解法5:矩阵法
前面四种方法都是从过程入手,逐一求得最终结果,那么换种思路,从结果入手,我们先来创造一个想要的结果的模版
const arr = ['a', 'b', 'c', 'd', 'e', 'f'];
// 创建一个 3x2 的辅助矩阵,用来记忆结果
const row = arr.length / 2;
const column = 2;
const matrix = Array(row).fill(0).map(x => Array(column).fill(0));
// 把矩阵的坐标和原数组的索引一一对应即可, 矩阵的坐标为 matrix[x][y]
for (let i = 0; i < row; i++) {
for (let j = 0; j < column; j++) {
matrix[i][j] = arr[j + i*2]; // 将笛卡尔坐标系转化成一维数组的角标
}
}
解法6:使用Lodash
Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。
git地址:https://github.com/lodash/lodash
<script src="lodash.js"></script>
_.chunk(['a', 'b', 'c', 'd'], 2);作者:ChuckieChang
链接:https://www.zhihu.com/question/563479952/answer/2737744935
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!