有条件地使用扩展运算符推送到数组

时间:2018-02-14 09:02:40

标签: javascript arrays spread-syntax

我正在根据这里所解释的条件将元素推送到数组http://2ality.com/2017/04/conditional-literal-entries.html

const arr = [
  ...(cond ? ['a'] : []),
  'b',
];

现在,这很好用,但是当我尝试

const arr = [
  ...(cond && ['a']),
  'b',
];

相反,它停止工作。

我想知道为什么它不再起作用了,如果有办法有条件地推动使用扩展运算符和&&而不是?。

谢谢

2 个答案:

答案 0 :(得分:2)

不,这是不可能的,因为所有可迭代的对象都是真实的。

如果cond为假,则您有Symbol.iterator无法传播的值

  

带有@@迭代器方法的内置类型是:

     



var cond = false;

const arr = [
  ...(cond && ['a']),  // throws error, function expected
  'b',
];

console.log(arr);




答案 1 :(得分:1)

,有可能。 但是也许这是一个过分的,它表现较差并降低了可读性。

const arr = [];
arr.push(...[false && 'nope'].filter(v => v));
arr.push(...[true && 'yep'].filter(v => v));
arr.push(...[false && 'no', true && 'yes'].filter(v => v));
    
console.info(arr);

与@Nina Scholz indicated一样,传播操作符需要迭代。通过使用第二个数组(可能为空),我们最终可以达到以下状态(arr.push())。