在reduce函数中是否可以缩短此if语句。 我尝试使用
acc = [...acc, v || ''];
但这只是添加一个空字符串。
Object.entries(props).reduce((acc, [k, v]) => {
if (v) {
acc = [...acc, v];
}
return acc;
}, []);
我也不想在[k,v]中使用k,因为linter吓坏了。如何不使用k变量但仍然获得value变量?
答案 0 :(得分:2)
使用三元表达式。您可以使用array destructuring to skip the key(k
)-[, v]
:
Object.entries(props).reduce((acc, [, v]) => v ? [...acc, v] : acc, []);
但是,更实用的解决方案(并且由于您不需要密钥)将使用Object.values()
和Array.filter()
与Boolean
来获得相同的结果:>
Object.values(props).filter(Boolean);
答案 1 :(得分:1)
您可以将一个空数组用作默认值,并使用concat
,它将空数组解析为中性值。
要获得已知索引的项目,可以通过获取索引来破坏数组。
result = Object
.entries(props)
.reduce((acc, { 1: v }) => acc.concat(v || []), []);
一个简短的版本应该只包含值。
result = Object
.values(props)
.reduce((acc, v) => acc.concat(v || []), []);
答案 2 :(得分:0)
我认为最简单的方法是使用.concat()
,如下所示:
之所以起作用,是因为concat(与push不同)会将数组的 contents 推送到另一个数组,而不是数组引用本身。通过隐含一个空数组,如果v
为假,则基本上是无操作的。这是所需的功能,是吗?
var arr = [1,2,3];
var v = null;
var x = 4;
arr = arr.concat(v || []);
console.log(arr);
arr = arr.concat(x || []);
console.log(arr);
在您的特定情况下:
Object.entries(props).reduce((acc, [k, v]) => acc.concat(v || []), []);
答案 3 :(得分:0)
acc = [...acc, ...(v? [v] : [])]
您可以像这样使用传播语法的组合。
诀窍是,在空数组上的...
将什么都不做:
[...[]] --> []
[1, 2, 3, ...[]] --> [1, 2, 3]
答案 4 :(得分:0)
您在这里正在执行不必要的操作:基本上在reduce的每个循环中创建一个新数组,并且将前一个元素分散在其顶部,只是在末尾添加一个元素!
基本上就是方法push
的工作方式,因此您可以使用它:
Object.values(props).reduce((acc, v) => (v && acc.push(v), acc), []);