如何创建一个元素数组,将 JavaScript 中 zip 生成的数组中的元素取消分组?
我们可以通过使用 JavaScript 中的不同方法(例如 Math.max() 和数组特定方法,即 Array.prototype.map()、Array.prototype.reduce( ) 和 Array.prototype.forEach()。此操作也可以称为解压缩。
在查看unzip之前,让我们了解zip的作用。 Zip创建一个元素数组,根据它们在原始数组中的位置进行分组。为此,我们可以使用 JavaScript 方法,例如 Math.max()、Array.from() 和 Array.prototype.map()。
方法:
- Math.max():从所有参数数组中获取最长的数组。
- 然后,创建一个具有该长度作为返回值的数组,并使用Array.from()和映射函数来创建一个分组元素数组。
- Array.prototype.map():将每个数组元素转换为一个新数组。
- 此外,扩展运算符(...) 用于表示可变数量的数组,这些数组可以作为参数传递给zip函数的参数字段。
例子:
Javascript
const zip = (...arrays) => {
const maxLength = Math.max(
...arrays.map(arr => arr.length));
return Array.from({ length: maxLength })
.map((_, i) => {
return Array.from(
{length: arrays.length },
(_, j) => arrays[j][i]);
});
};
console.log(
zip(
[1, "GFG", 0.1],
[2, "GeeksForGeeks", 0.2],
[3, "Geeks", 0.3],
[4, "For", 0.4],
[5, "Geeks", 0.5]
)
);
Javascript
const unzip = (arr, f) => arr.reduce(
(a, myValue) => (myValue.forEach(
(val, i) => a[i].push(val)), a),
Array.from({
length: Math.max(
...arr.map(myArr => myArr.length)),
}).map(myArr => [])
)
.map(v => f(...v));
console.log(
unzip(
[
[1, 3, 5],
[2, 6, 10],
[3, 9, 15],
],
(...arguments) => arguments
.reduce((acc, j) => acc + j, 0)
)
);
输出:
现在让我们看看如何实现unzip :
- Math.max():获取数组中最长的子数组。
- Array.prototype.map():将每个数组元素变成一个数组。
- Array.prototype.reduce()和Array.prototype.forEach():将分组值映射到单个数组。
- 最后, Array.prototype.map()和扩展运算符(...) 用于在 unzip函数中应用f参数 到每个单独的元素组。
例子:
Javascript
const unzip = (arr, f) => arr.reduce(
(a, myValue) => (myValue.forEach(
(val, i) => a[i].push(val)), a),
Array.from({
length: Math.max(
...arr.map(myArr => myArr.length)),
}).map(myArr => [])
)
.map(v => f(...v));
console.log(
unzip(
[
[1, 3, 5],
[2, 6, 10],
[3, 9, 15],
],
(...arguments) => arguments
.reduce((acc, j) => acc + j, 0)
)
);
输出: