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


Answers:


231

当条件为时,可以将数组散布在数组内部,以保持项目数组的清洁false

这是您的操作方法

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

console.log(items)

说明

如您所见,三元运算符总是返回一个数组。

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

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

如果没有任何数组项(当三元检查为时false),则不会执行任何操作,这是我们的目标。


在其他答案中,我解释了相同的想法,只是针对对象。您也可以在这里检查。


1
我最近需要这样做,使用传播似乎是我最明显的解决方案。很高兴其他人也在使用这种模式。我不想使其变得过于神秘,但由于它似乎很受欢迎,因此我将继续使用它。
张天伦

非常感谢〜!我什至都没有考虑将利差作为一种选择
carinlynchin

这非常酷,我认为在事实发生后不对数组进行过滤就不会有这种方法
JDune19,19年

1
该死的,这就是为什么我喜欢的EcmaScript
安妮

1
优秀的解决方案!
catch22

22

我会这样做

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

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


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

@Martin是的,也许可以在答案中详细说明。我将继续进行编辑!
Michael Bergquist Suarez,

我认为如果我需要像这样的数组将会有问题:const arr = ['one','two',false,true]; 但是,主意对真实价值有好处:)
Sanjib Debnath


8

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

const cond = true;
const myArr = ["foo"].concat(cond ? ["bar"] : []);

聪明,对我有条件的阵列const myArr = (cond ? ['item 1'] : []).concat(['item 2', 'item 3']);
阵阵

6

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

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

if (cond) myArr.push("bar");

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

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

myArr = myArr.filter((item) => item !== null);

2

有几种不同的方法,但是您执行的方法实际上不适用于Javascript。

最简单的解决方案是只具有if语句。

if (myCond) arr.push(element);

还有filter,但我根本不希望这是您想要的,因为您似乎想要“如果这一条件成立,则添加此内容”,而不是针对某个条件检查所有内容。虽然,如果您想变得非常怪异,可以执行此操作(不建议这样做,但是可以这样做很酷)。

var arr = ["a", cond && "bar"];
arr.filter( e => e)

基本上,它只会过滤掉所有非真实值。


1
这看起来很酷。您也可以执行var arr = ["a", cond && "bar"].filter(e => e);@Adam LeBlanc,但您说对了,可能是垃圾。但很酷的垃圾;)
Manu Schiller

这很酷,但我建议您不要因为一个条件值而反对它。它更适合用于通用的“摆脱所有错误值”类型的东西。由于您将只需要遍历整个数组就可以得到一个值。但是,如果您有数量不确定的条件值,那么这可能是一个很好的解决方案。
亚当·勒布朗

.filter(e => e)将过滤出空字符串。
马丁

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

console.log(myArr)

将导致[“ foo”]


0

替代方法:填充前过滤器而不是后过滤器:

const populate = function(...values) {
    return values.filter(function(el) {
        return el !== false
    });
};

console.log(populate("foo", true && "bar", false && "baz"))

退货

(2) ["foo", "bar"]

我知道这不能解决速记符号(因为无论您尝试什么都将无法使用),但是它已经接近了。


0

如果您使用的是es6,我建议

let array = [ "bike", "car", name === "van" ? "van" : null, "bus", "truck", ].filter(Boolean);

如果名称等于“ van”,则此数组仅包含值“ van”,否则将被丢弃。


-1

如果您使用 Array.push

你可以按照

var a = ["1"]
a.push(... !true ? ["2"] : [])

结果是 ["1"]

要么

var a = ["1"]
a.push(... true ? ["2"] : [])

结果是 ["1","2"]


如果您要使用check和,那么push您的解决方案绝对不是清晰度最高的解决方案。我会坚持,if (check) foo.push( item );而不是在虚假情况下散布一个空数组。
马丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.