javascript - 将 2D 数组的 2D 网格展平为单个 2D 数组,在 JavaScript 中(功能上?)

标签 javascript arrays multidimensional-array functional-programming flatten

我正在开发的游戏有一个二维数组( block )的二维数组(网格):

const c1 = [[1, 2],
            [3, 4]]

const c2 = [[5, 6],
            [7, 8]]

const c3 = [[9, 0],
            [1, 2]]

const c4 = [[3, 4],
            [5, 6]]

const grid_of_chunks = [[c1, c2],
                        [c3, c4]];

我想将 grid_of_chunks 缩减/展平为:

[[1, 2, 5, 6],
 [3, 4, 7, 8],
 [9, 0, 3, 4],
 [1, 2, 5, 6]]

我已经能够为此实现一个函数式解决方案(在 Clojure 的两行代码中),但我正在努力将其转换为函数式 JavaScript,并弥合两种语言的 之间的差距map 语义(JS map 只接受一个数组,而 Clojure 的 map 接受许多集​​合...)。

据我所知:

function join_grid_of_chunks(gofc) {
    const joined_horiz = gofc.map(
        gofc_row => [].map.apply(gofc_row, [cs => [].concat.apply(cs)])
    );
    return [].concat.apply(joined_horiz);
}

编辑:Clojure 解决方案(适用于任意大小的方形网格中统一大小的方形 block ):

(defn join-grid-of-chunks [gofc]
  (let [joined (map #(apply map concat %) gofc)]
    (apply concat joined)))

最佳答案

使用 flatMap 的更通用的解决方案是映射每个网格行的第一个 block 的索引。

function joinGridOfChunks(grid) {
    return grid.flatMap(row => row[0].map((_, i) => row.flatMap(chunk => chunk[i])))
}

使用 zip 函数(例如 lodash 中的函数),您可以稍微优雅地编写它:

function zip(...arrays) {
    return arrays[0].map((_, i) => arrays.map(arr => arr[i]))
}
function joinChunks(chunks) { // Horizontally join an array of chunks e.g. [[[1,2],[3,4]], [[5,6],[7,8]]] --> [[1,2,5,6],[3,4,7,8]]
    return zip(...chunks).map(row => row.flat())
}
console.log(gridOfChunks.flatMap(joinChunks));

zip plus map 似乎接近于 Clojure 的带有多个集合的 map。这应该适用于二维网格中的任何形状的二维 block 。

关于javascript - 将 2D 数组的 2D 网格展平为单个 2D 数组,在 JavaScript 中(功能上?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71432139/

相关文章:

javascript - JS检查对象数组是否包含对象

python - bin 3d 指向 python 中的 3d bins

javascript - javascript 中的 Replace() 函数带有\d 模式

c# - 类对象数组的构造函数

javascript - 未知提供者 : $resourceProvider <- $resource with AngularJS

Php将值推送到二维数组

c++ - 删除指针数组

c# - 将 C# 锯齿状数组转换为数组并再次返回

javascript - 如何使用 .on ('click' 收集 jquery 中的随机 id )

javascript - 动态地将数字添加为现有对象的属性