转换编码布尔三维数组的字符串

时间:2017-07-27 00:49:15

标签: javascript functional-programming lodash

假设3D矩阵以string的形式编码,如下所示:

src = "1 0 0  1 1 1   0 0 0  0 0 1"

...其中三个空格分隔图层,两个空格分隔行,一个空格分隔列。

最终,我的目标是能够将其转换为bool的3D矩阵:

console.log(result)  // [[[1, 0, 0], [1, 1, 1]], [[0, 0, 0], [0, 0, 1]]]

如何使用纯函数方法将src转换为获取result?我正在使用Lodash

2 个答案:

答案 0 :(得分:3)

为什么要lodash?使用JS map

src.split("   ")
   .map(layer => layer.split("  ")
   .map(rows => rows.split(" ")
   .map(item => +item)));
// [ [ [ 1, 0, 0 ], [ 1, 1, 1 ] ], [ [ 0, 0, 0 ], [ 0, 0, 1 ] ] ]

答案 1 :(得分:1)

我最好的选择是递归功能,但事先得到了能够在单线中做到这一点的人的称赞。给出:

const src = "1 0 0  1 1 1   0 0 0  0 0 1"

我们将breakStuff/2定义为:

function breakStuff(spaces, input) {
    if (spaces.length == 0) return parseInt(input) 
    return _.map(_.split(input, _.first(spaces)), i => breakStuff(_.tail(spaces), i))
}

用法示例:

breakStuff(['   ', '  ', ' '], src)

返回:

​​​​​​​​​​[ [ [ 1, 0, 0 ], [ 1, 1, 1 ] ], [ [ 0, 0, 0 ], [ 0, 0, 1 ] ] ]​​​​​

附录:根据您的规范 - 尽管您自己的示例使用了0&{39}和1 - 结果应该由bool'第为此,只需更改为以下行:

if (spaces.length == 0) return input == '1' 

哪会回来:

[ [ [ true, false, false ], [ true, true, true ] ],​​​​​
​​​​​  [ [ false, false, false ], [ false, false, true ] ] ]​​​​​