条件付き要素で配列を定義する方法は?


99

条件付き配列要素を定義するにはどうすればよいですか?私はこのようなことをしたい:

const cond = true;
const myArr = ["foo", cond && "bar"];

これは期待どおりに機能します。 ["foo", "bar"]

しかし、に設定condするfalseと、次の結果が得られます。["foo", false]

条件付き要素を使用して配列を定義するにはどうすればよいですか?


回答:


231

条件がfalse。の場合、アイテムの配列をクリーンに保つために、配列を配列内に広げることができます。

これがあなたがそれをすることができる方法です

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

console.log(items)

説明

ご覧のとおり、三項演算子は常に配列を返します。

条件がの場合はtrue、を返し['bar']、そうでない場合は空の配列を返します[]

その後、...(三項演算から)結果の配列を分散し、配列の項目を親配列にプッシュします。

配列項目がない場合(3値チェックがの場合false)、何もプッシュされません。これが私たちの目標です。


他の答えでは、私は同じ考えを説明しましたが、オブジェクトについてです。こちらでも確認できます


1
私は最近これを行う必要があり、スプレッドを使用することは私にとって最も明白な解決策のように思えました。他の人もこのパターンを使用していることをうれしく思います。私はそれをあまりにも不可解にしたくありませんでしたが、それは十分に人気があるように思われるので、私はそれで実行するつもりです。
ブレナンチャン

どうもありがとう〜!! 私はちょうどでもオプションとして広がりを考慮していない
carinlynchin

これは、事実の後に、配列をフィルタリングせずにこれを行う方法があるだろうとは思いませんでした、非常にクールです
JDune

1
くそーそれが私がEcmascriptを愛する理由です
anni

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

@マーティンええ、多分それは答えで詳しく説明されるかもしれません。先に進んで編集します!
Michael BergquistSuarez18年

次のような配列が必要な場合は問題があると思います。constarr= ['one'、 'two'、false、true]; しかし、アイデアは真実の価値に適しています:)
Debnath


8

本当にワンライナーとして保持したい場合は、次を使用できます。

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

巧妙な、すなわち配列の条件付きフロントのために私のために有用であったconst myArr = (cond ? ['item 1'] : []).concat(['item 2', 'item 3']);
devonj

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ますが、すべてを何らかの条件でチェックするのではなく、「この1つの条件が真なら、これを1つ追加する」ということになるので、ここではまったく必要ないと思います。ただし、本当に気紛れになりたい場合は、これを行うことができます(お勧めしませんが、できるのはクールです)。

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

基本的には、真でない値をすべて除外するだけです。


1
これはかっこいいようです。var arr = ["a", cond && "bar"].filter(e => e);@Adam LeBlancを実行することもできますが、その通りです。おそらくゴミです。しかし、かっこいいゴミ;)
Manu Schiller 2017

かっこいいですが、条件値を1つだけにすることはお勧めしません。これは、一般的な目的の「すべての誤った値を取り除く」タイプのものに適しています。配列全体を1つの値で処理することになります。ただし、条件値の量が不明な場合は、おそらくそれが適切な解決策です。
Adam LeBlanc 2017

.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"]


あなたがを使用しようとしているならcheckpushあなたの解決策は間違いなく最高の明快さを持つものではありません。if (check) foo.push( item );偽の場合、空の配列を広げるのではなく、固執します。
マーティン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.