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 cond
ke false
, saya mendapatkan hasil sebagai berikut:["foo", false]
Bagaimana saya bisa mendefinisikan array dengan elemen bersyarat?
javascript
arrays
Manu Schiller
sumber
sumber
Jawaban:
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 .
sumber
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.
sumber
Anda dapat mencoba dengan sederhana jika:
if(cond) { myArr.push("bar"); }
sumber
Jika Anda benar - benar ingin menyimpannya sebagai satu liner, Anda dapat menggunakan:
const cond = true; const myArr = ["foo"].concat(cond ? ["bar"] : []);
sumber
const myArr = (cond ? ['item 1'] : []).concat(['item 2', 'item 3']);
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);
sumber
const cond = false; const myArr = ["foo", cond ? "bar" : null].filter(Boolean); console.log(myArr)
Akan menghasilkan ["foo"]
sumber
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.
sumber
var arr = ["a", cond && "bar"].filter(e => e);
@Adam LeBlanc tetapi Anda benar, itu mungkin sampah. tapi sampah dingin;)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.
sumber
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.
sumber
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"]
sumber
check
danpush
solusi Anda pasti bukan yang dengan kejelasan tertinggi. Saya akan tetap menggunakanif (check) foo.push( item );
alih - alih menyebarkan array kosong dalam kasus palsu.