📌  相关文章
📜  如何创建一个元素数组,将 JavaScript 中 zip 生成的数组中的元素取消分组?

📅  最后修改于: 2022-05-13 01:56:27.671000             🧑  作者: Mango

如何创建一个元素数组,将 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)
    )
);

输出: