Koşullu öğeler içeren bir dizi nasıl tanımlanır?


102

koşullu dizi öğelerini nasıl tanımlayabilirim? bunun gibi bir şey yapmak istiyorum:

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

bu beklendiği gibi çalışıyor: ["foo", "bar"]

Ben set Ama eğer condüzere false, aşağıdaki sonuç almak:["foo", false]

Koşullu eleman içeren bir diziyi nasıl tanımlayabilirim?


Yanıtlar:


236

Koşul olduğu zaman, öğeler dizisini temiz tutmak için bir diziyi bir dizinin içine yayabilirsiniz false.

İşte bunu nasıl yapabileceğiniz :

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

console.log(items)

Açıklamalar :

Gördüğünüz gibi üçlü operatör her zaman bir dizi döndürür.

Koşul ise , aksi takdirde boş bir dizi truedöndürür .['bar'][]

Bundan sonra ortaya ...çıkan diziyi (üçlü işlemden) yayarız ve dizinin öğeleri üst diziye gönderilir.

Herhangi bir dizi öğesi yoksa (üçlü kontrol olduğunda false), o zaman hiçbir şey itilmeyecektir, ki bu bizim amacımızdır.


Diğer cevapta aynı fikri açıkladım, ancak nesneler için. Buradan da kontrol edebilirsiniz .


1
Son zamanlarda bunu yapmam gerekiyordu ve yaymayı kullanmak bana en bariz çözüm gibi göründü. Diğerlerinin de bu modeli kullanmasına sevindim. Çok şifreli yapmak istemedim ama yeterince popüler göründüğü için onunla koşacağım.
Brennan Cheung

çok teşekkürler ~ !! spread'i bir seçenek olarak bile düşünmedim
carinlynchin

Bu çok havalı, gerçeğin ardından diziyi filtrelemeden bunu yapmanın bir yolu olacağını düşünmemiştim
JDune

1
Lanet olsun Ecmascript'i bu yüzden seviyorum
anni

1
Mükemmel çözüm!
catch22

22

Bunu yapardım

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

Bunun boş dizeler gibi yanlış değerleri de kaldıracağını unutmayın .


1
Fikri beğendim. Ancak [true && ''] için uygulamanız yanlış olur. Boş dizge filtrelenir. [Foo] .filter (isNonBoolean) veya [foo] .stripBoolean () gibi bir yardımcı işlevi kullanmayı tercih ederim
Martin

@Martin Evet, belki bu cevapta detaylandırılabilir. Devam edip düzenleyeceğim!
Michael Bergquist Suarez

Bunun gibi bir diziye ihtiyacım olursa bir sorun çıkacağını düşünüyorum: const arr = ['bir', 'iki', yanlış, doğru]; Ama fikir doğru değer için iyidir :)
Sanjib Debnath


8

Eğer varsa gerçekten bir astar olarak tutmak istiyorum, şunu kullanabilirsiniz:

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

zeki, dizi yani koşullu ön benim için faydalı olduconst myArr = (cond ? ['item 1'] : []).concat(['item 2', 'item 3']);
devonj

6

Kullanmaktan başka çok seçeneğiniz yok push:

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

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

Başka bir fikir, potansiyel olarak boş değerler eklemek ve bunları filtrelemektir:

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

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

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

console.log(myArr)

["Foo"] ile sonuçlanır


2

Birkaç farklı yol var, ancak bunu yapma şekliniz Javascript için gerçekten işe yaramayacak.

En kolay çözüm, sadece bir if ifadesine sahip olmaktır.

if (myCond) arr.push(element);

Bir de var filter, ama burada istediğiniz şeyin bu olduğunu sanmıyorum, çünkü her şeyi bir koşulla kontrol etmektense, "Bu tek bir koşul doğruysa, şunu ekleyin" diye düşünüyorsunuz. Yine de, gerçekten çıldırmak istiyorsan, bunu yapabilirsin (tavsiye etmem, ama yapman harika).

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

Temel olarak, tüm gerçek olmayan değerleri filtreleyecektir.


1
bu harika görünüyor. var arr = ["a", cond && "bar"].filter(e => e);@Adam LeBlanc'ı da yapabilirsiniz ama haklısınız, muhtemelen çöp. but cool garbage;)
Manu Schiller

Harika, ancak tek bir koşullu değer için buna karşı tavsiye ederim. "Tüm yanlış değerlerden kurtulun" gibi genel bir amaç için daha uygundur. Tek bir değer için tüm diziyi gözden geçireceğiniz için. Ancak belirsiz miktarda koşullu değeriniz varsa, bu muhtemelen iyi bir çözümdür.
Adam LeBlanc

.filter (e => e) boş dizeyi filtreleyecektir.
Martin

0

Alternatif yaklaşım: Sonradan filtreleme yerine Ön Filtre doldurun:

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

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

İadeler

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

Bunun kısa notasyonu çözmediğini biliyorum (çünkü ne denersen dene işe yaramayacak) ama buna yakın geliyor.


0

es6 kullanıyorsanız, tavsiye ederim

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

Bu dizi, eğer isim "van" e eşitse, sadece "van" değerini içerecektir, aksi takdirde atılacaktır.


-1

Eğer kullanırsan Array.push

Takip edebilirsin

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

Sonuç ["1"]

veya

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

Sonuç ["1","2"]


A checkve a kullanacaksanız push, çözümünüz kesinlikle en yüksek netliğe sahip değildir. Ben sopa ile olur if (check) foo.push( item );yerine falsy durumda boş bir dizi yayma.
Martin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.