javascript - 如何使用 Ramda 将数组数组转换为对象数组?

标签 javascript arrays functional-programming ramda.js

背景

我有一个数组数组,表示具有以下格式的网格:

const grid = [
    [null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null],
    [null, "®" , null, null, null, null, "®" ],
    ["©" , "©" , null, null, "©" , "®" , "®" ],
    ["®" , "®" , "®" , "©" , "®" , "©" , "©" ],
    ["®" , "©" , "©" , "®" , "©" , "®" , "©" ],
];

目标

我的目标是将该数组转换为以下内容:

const grid = [ 
    { row: 0, column: 1, value: null},
    { row: 0, column: 2, value: null},
    { row: 0, column: 3, value: null},
    //... some rows after ...
    { row: 3, column: 0, value: "©"},
    // etc...
];

研究

我的第一个想法是使用两个嵌套的 R.mapR.chain 它。但是我有一个主要问题:ramda 函数将索引作为参数(与 JavaScript 中的计数器实现不同)。

所以我认为使用 ramda 做这个练习是不可能的。

问题

有没有办法只使用 ramda 函数(没有 for 循环)来完成这个练习?

最佳答案

正如评论中所讨论的:这是一个没有 ramda 的版本,但也没有任何 for 循环。

希望你会喜欢它;)

如您所见,完全可以在没有任何 for 循环的情况下执行此操作,并且没有像 ramda 或其他库这样的任何覆盖。

const grid = [
    [null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null],
    [null, "®" , null, null, null, null, "®" ],
    ["©" , "©" , null, null, "©" , "®" , "®" ],
    ["®" , "®" , "®" , "©" , "®" , "©" , "©" ],
    ["®" , "©" , "©" , "®" , "©" , "®" , "©" ],
];

const result = grid.reduce((r, array, i) => [...r, ...array.map((value, j) => ({row: i, column: j, value}))], []);

console.log(result);

关于javascript - 如何使用 Ramda 将数组数组转换为对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51555254/

相关文章:

f# - 反向柯里化(Currying)?

javascript - 在 WordPress 中单击即可创建新用户

javascript - 在 IE 和 JSFiddle 中使用 elem.dataset 时出现问题

javascript - 如何在不触发缓慢重绘的情况下在网页上移动 SVG?

php - 如何在 PHP 中使用数组制作表格?

javascript - 函数式 jQuery : Custom Events or Functions?

javascript - 使用触控板时捕获滚轮/鼠标滚轮事件的边缘替代解决方案

java - 最大对数

arrays - 通过连接两个递增子数组构成的最大长度递增 super 数组

haskell - Haskell : Syntax error in input (unexpected `=' )