我有一个属性为grid[][]
的类,每个值都是true或false。我需要把它转换成字符串,用字母o和b来代替布尔值。
首先,对数组进行简单的for循环并返回字符串:
get rle() {
let result = "";
for(let y = 0; y < this.grid.length; y++) {
for(let x =0; x < this.grid[y].length; x++) {
result += ( (this.grid[y][x]) ? "o" : "b" );
}
}
return result;
}
还是更像JS风格的解决方案?
get rle() {
return this.grid.reduce( (total, currentValue, currentIndex, arr) => {
return total + arr[currentIndex].reduce( (total, currentValue, currentIndex, arr) => {
return total + ( (arr[currentIndex]) ? "o" : "b" );
}, "");
}, "");
}
这是一个好的JS风格的解决方案,你认为什么更好?我更喜欢第一种,因为任何人都能立即理解它。JS解决方案使我皱眉与3嵌套返回,看起来很奇怪。
发布于 2019-02-11 04:35:41
首先,您编写的代码中的几个要点。如果您有一个值数组,您可以将这些值组合在一起,以有效地创建一个字符串。这将消除对至少一个reduce
调用的需求。其次,在减少调用中,第二个回调参数(代码中的currentValue
)的值是索引参数(代码中的arr[currentIndex]
)的数组参数的值。结合Javascript忽略多余函数参数的功能,您的reduce
调用应该只接受两个参数,并使用currentValue
代替arr[currentIndex]
。
您还应该避免在同一个作用域中使用相同的变量名。拥有两组total
、currentValue
、currentIndex
和arr
可能很快就会引起混淆,并导致奇怪的bug。
现在,对于一个班轮来说:
return this.grid.flat().map((el) => el ? "o" : "b").join("");
参见Array#flat
、Array#map
和前面提到的Array#join
。其中,Array#flat
是最新的,可能是不受支持的方法。它可以很容易地多填充或更换。MDN页面显示了一些聪明的替代品,如arr.reduce((all, row) => all.concat(row), [])
和[].concat(...arr)
。
https://codereview.stackexchange.com/questions/213218
复制相似问题