以点自由表示法的二维数组映射?

时间:2015-08-31 18:50:37

标签: javascript arrays functional-programming ramda.js

我正在玩功能性/默契式编程,特别是创建蛇游戏(游戏示例:http://patorjk.com/games/snake/

具体问题是我正在使用一系列字符串:

[
 ['2 '],
 ['10']
]

并希望以'value'的数字顺序获取坐标列表。在域中,0是蛇的头部,2是尾部,整个是板。

所以我建立了:

var findSnake = function(rendered_board) {
  return r.map(function(x) {
    return r.map(function (y) {
      return {
        x: x,
        y: y,
        val: rendered_board[x][y]
      };
    })(r.keys(r.split('', rendered_board[x])));
  })(r.keys(rendered_board));
};

让我回来:

[ [ { x: '0', y: '0', val: '2' }, { x: '0', y: '1', val: ' ' } ], [ { x: '1', y: '0', val: '1' }, { x: '1', y: '1', val: '0' } ] ] 然后,我可以排序并获得我的坐标列表。它有效,但我对风格有疑问。

有没有办法以点自由风格编写findSnake?对这个问题有更惯用的方法吗?

1 个答案:

答案 0 :(得分:1)

正如预期的那样,这似乎太难以变成一个可读的无点解决方案。我确实采用了一个更简单的子集,只是为了看看我能做些什么,而且它本身很丑陋,以至于我没有完成它。

如果我们开始使用此功能:

var fn = function(list) {
    return R.map(function(y) {
        return {
            y: y
        };
    }, list);
}

......这显然可以被认为是原作的内在子问题,然后,我可以把它变成这个怪物:

var fn = R.pipe(R.converge(
    R.zip, 
    R.pipe(R.length, R.repeat('y')), 
    R.identity
), R.map(R.apply(R.createMapEntry)));

(某些中间步骤位于 REPL

但考虑到这在es6中看起来如何,这似乎非常适得其反:

var fn = R.map(y => ({y});

这就是为什么我在有意义的时候使用免费积分,但不要尝试在任何地方使用它。

<强>更新

version 0.18起,Ramda将createMapEntry重命名为objOf,使converge成为二元函数,这意味着上面的代码不再有效。 REPL链接也没有,因为REPL已经更新。您现在可以在 REPL

中看到它已更新