Bagaimana cara mendefinisikan array dengan elemen bersyarat?

107

bagaimana saya bisa mendefinisikan elemen array bersyarat? saya ingin melakukan sesuatu seperti ini:

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

ini berfungsi seperti yang diharapkan: ["foo", "bar"]

Tetapi jika saya set condke false, saya mendapatkan hasil sebagai berikut:["foo", false]

Bagaimana saya bisa mendefinisikan array dengan elemen bersyarat?

Manu Schiller
sumber

Jawaban:

252

Anda bisa menyebarkan sebuah array di dalam sebuah array, untuk menjaga array item tetap bersih, jika kondisinya adalah false.

Inilah cara Anda melakukannya :

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

console.log(items)

Penjelasan :

Seperti yang Anda lihat, operator terner selalu mengembalikan array.

Jika kondisinya true, maka ia mengembalikan ['bar'], jika tidak, array kosong [].

Setelah itu kami menyebarkan ...larik yang dihasilkan (dari operasi terner) dan item larik didorong ke larik induk.

Jika tidak ada item array (ketika pemeriksaan terner false), maka tidak ada yang akan didorong, yang merupakan tujuan kami.


Dalam jawaban lain saya menjelaskan ide yang sama, tetapi untuk objek. Anda juga dapat memeriksanya di sini .

Jordan Enev
sumber
1
Saya baru-baru ini perlu melakukan ini dan menggunakan penyebaran sepertinya solusi paling jelas bagi saya. Senang orang lain menggunakan pola ini juga. Saya tidak ingin membuatnya terlalu samar, tetapi saya akan menggunakannya karena tampaknya cukup populer.
Brennan Cheung
terima kasih banyak ~ !! saya bahkan tidak menganggap penyebaran sebagai pilihan
carinlynchin
Ini sangat keren, tidak berpikir akan ada cara untuk melakukan ini tanpa memfilter array setelah fakta
JDune
2
Sial, itu sebabnya saya suka Ecmascript
anni
1
Solusi luar biasa!
Tangkapan22
25

Saya akan melakukan ini

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

Perhatikan bahwa ini juga akan menghapus nilai palsu , seperti string kosong.

Michael Bergquist Suarez
sumber
1
Aku suka gagasan itu. Tetapi penerapan Anda akan salah untuk [true && '']. String kosong akan disaring. Saya lebih suka menggunakan fungsi pembantu seperti [foo] .filter (isNonBoolean) atau [foo] .stripBoolean ()
Martin
@Martin Iya, mungkin itu bisa dielaborasi di jawabannya. Saya akan melanjutkan dan mengeditnya!
Michael Bergquist Suarez
Saya pikir akan ada masalah jika saya membutuhkan array seperti ini: const arr = ['one', 'two', false, true]; Tapi ide bagus untuk nilai
kebenaran
10

Anda dapat mencoba dengan sederhana jika:

if(cond) {
    myArr.push("bar");
}
Sylvain Attoumani
sumber
8

Jika Anda benar - benar ingin menyimpannya sebagai satu liner, Anda dapat menggunakan:

const cond = true;
const myArr = ["foo"].concat(cond ? ["bar"] : []);
James Thorpe
sumber
pintar, berguna bagi saya untuk front bersyarat dari array yaituconst myArr = (cond ? ['item 1'] : []).concat(['item 2', 'item 3']);
devonj
6

Anda tidak memiliki banyak pilihan selain menggunakan push:

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

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

Ide lain berpotensi menambahkan null dan memfilternya:

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

myArr = myArr.filter((item) => item !== null);
Alberto Trindade Tavares
sumber
3
const cond = false;
const myArr = ["foo", cond ? "bar" : null].filter(Boolean);

console.log(myArr)

Akan menghasilkan ["foo"]

Westman
sumber
2

Ada beberapa cara berbeda, tetapi cara Anda melakukannya tidak akan benar-benar berfungsi untuk Javascript.

Solusi termudah adalah dengan hanya memiliki pernyataan if.

if (myCond) arr.push(element);

Ada juga filter, tapi saya rasa itu sama sekali bukan yang Anda inginkan di sini, karena Anda tampaknya menginginkan "Tambahkan satu hal ini, jika satu syarat ini benar" daripada memeriksa semuanya dengan suatu ketentuan. Meskipun, jika Anda ingin menjadi benar-benar aneh, Anda bisa melakukan ini (tidak akan merekomendasikan, tapi kerennya Anda bisa).

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

Pada dasarnya itu hanya akan menyaring semua nilai yang tidak benar.

Adam LeBlanc
sumber
1
ini sepertinya keren. Anda juga dapat melakukan var arr = ["a", cond && "bar"].filter(e => e);@Adam LeBlanc tetapi Anda benar, itu mungkin sampah. tapi sampah dingin;)
Manu Schiller
Ini keren, tetapi saya akan menyarankan agar tidak melakukannya hanya karena satu nilai bersyarat. Ini lebih cocok untuk tujuan umum "Singkirkan semua nilai palsu". Karena Anda hanya akan melewati seluruh array hanya untuk satu nilai. Tetapi jika Anda memiliki jumlah nilai bersyarat yang tidak dapat ditentukan, maka itu mungkin solusi yang baik.
Adam LeBlanc
.filter (e => e) akan memfilter string kosong.
Martin
0

Pendekatan alternatif: Pre-Filter mengisi alih-alih pemfilteran posting:

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

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

Kembali

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

Saya tahu itu tidak memecahkan notasi steno (karena tidak akan berhasil apa pun yang Anda coba) tetapi mendekati itu.

Jankapunkt
sumber
0

jika Anda menggunakan es6, saya sarankan

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

Larik ini hanya akan berisi nilai "van" jika nama sama dengan "van", jika tidak maka akan dibuang.

Konsultasi Naxxa
sumber
-1

jika Anda menggunakan Array.push

Anda bisa mengikuti

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

Hasilnya adalah ["1"]

atau

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

Hasilnya adalah ["1","2"]

nuklir
sumber
Jika Anda akan menggunakan checkdan pushsolusi Anda pasti bukan yang dengan kejelasan tertinggi. Saya akan tetap menggunakan if (check) foo.push( item );alih - alih menyebarkan array kosong dalam kasus palsu.
Martin