如何用条件元素定义数组?

Man*_*ler 54 javascript arrays

我该如何定义条件数组元素?我想做这样的事情:

const cond = true;
const myArr = ["foo", cond && "bar"];
Run Code Online (Sandbox Code Playgroud)

这按预期工作: ["foo", "bar"]

但是,如果我设置condfalse,我得到以下结果:["foo", false]

我怎么能用条件元素定义数组?

Jor*_*nev 128

您可以在数组内部传播数组,以便在条件满足时保持项数组清洁false.

这是你如何做到的:

// Will result in ['foo', 'bar']
const items = [
  'foo',
  ... true ? ['bar'] : [],
  ... false ? ['falsy'] : [],
]

console.log(items)
Run Code Online (Sandbox Code Playgroud)

解释:

如您所见,三元运算符始终返回一个数组.

如果条件是true,则返回['bar'],否则返回一个空数组[].

之后,我们展开了...结果数组(来自三元运算),数组的项目被推送到父数组.

如果没有任何数组项(当三元检查时false),则不会推送任何内容,这是我们的目标.


在其他答案中,我解释了相同的想法,但对于对象.你也可以在这里查看.

  • 该死,这就是我喜欢 Ecmascript 的原因 (4认同)
  • 我最近需要这样做,使用传播对我来说似乎是最明显的解决方案。很高兴其他人也使用这种模式。我不想让它太神秘,但我会继续使用它,因为它看起来足够流行。 (2认同)
  • 优秀的解决方案! (2认同)

Mic*_*rez 13

我会这样做的

[
  true && 'one',
  false && 'two',
  1 === 1 && 'three',
  1 + 1 === 9 && 'four'
].filter(Boolean) // ['one', 'three']
Run Code Online (Sandbox Code Playgroud)

请注意,这也将删除虚假值,例如空字符串.

  • 我喜欢这个主意。但是您的实现对于 [ true && ''] 来说是错误的。空字符串将被过滤掉。我宁愿使用像 [foo].filter(isNonBoolean) 或 [foo].stripBoolean() 这样的辅助函数 (2认同)

Alb*_*res 6

除了使用之外,您没有太多选择push

const cond = true;
const myArr = ["foo"];

if (cond) myArr.push("bar");
Run Code Online (Sandbox Code Playgroud)

另一个想法是可能添加空值并将其过滤掉:

const cond = true;
const myArr = ["foo", cond ? "bar" : null];

myArr = myArr.filter((item) => item !== null);
Run Code Online (Sandbox Code Playgroud)


Syl*_*ani 5

您可以尝试以下简单方法:

if(cond) {
    myArr.push("bar");
}
Run Code Online (Sandbox Code Playgroud)

  • OP 明确要求采用声明式方式来执行此操作,而不是命令式方式。 (3认同)

Jam*_*rpe 5

如果您真的想将其保持为一体,可以使用:

const cond = true;
const myArr = ["foo"].concat(cond ? ["bar"] : []);
Run Code Online (Sandbox Code Playgroud)


小智 5

const cond = false;
const myArr = ["foo", cond ? "bar" : null].filter(Boolean);

console.log(myArr)
Run Code Online (Sandbox Code Playgroud)

将导致 ["foo"]