如何缩短在数组中具有if语句的JavaScript代码

时间:2019-02-08 21:10:12

标签: javascript arrays ecmascript-6

在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变量?

5 个答案:

答案 0 :(得分:2)

使用三元表达式。您可以使用array destructuring to skip the keyk)-[, 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), []);