用 JavaScript(函数式方法?)将二维数组的二维网格扁平化为单个二维数组。

3
我有一个2D数组(网格),它包含多个2D数组(块),用于我正在开发的游戏:
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解决方案(适用于等大小的正方形块,在任意大小的正方形网格中):

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

1
使用flatMap的一种更通用的解决方案是对每个网格行的第一个块的索引进行映射。
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));
< p > zipmap 看起来与 Clojure 的多个集合的 map 很接近。这适用于 2D 网格中任何形状的二维块。

1

以下是我所拥有的:

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]
];

function transform(input) {
  return input.flatMap(rows => {
    return rows.reduce((result, chunk) => {
      chunk.forEach((row, rowIndex) => {
        result[rowIndex] = result[rowIndex] || [];
        result[rowIndex].push(...row);
      });
      return result;
    }, []);
  });
}

console.log(transform(grid_of_chunks));

应该适用于NxN的块和MxM的网格


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接