Jak mogę zdefiniować elementy tablicy warunkowej? Chcę zrobić coś takiego:

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

Działa to zgodnie z oczekiwaniami: ["foo", "bar"]

Ale jeśli ustawię cond do false, otrzymuję następujący wynik: ["foo", false]

Jak mogłem zdefiniować tablicę z elementem warunkowym?

177
Manu Schiller 4 lipiec 2017, 17:07

10 odpowiedzi

Najlepsza odpowiedź

Możesz rozłożyć tablicę wewnątrz tablicy, w celu utrzymania tablicy elementów czyste, gdy warunek jest false.

Oto jak możesz to zrobić :

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

console.log(items)

Objaśnienia :

Jak widać, operator Terrary zawsze zwraca tablicę.

Jeśli warunek jest true, wówczas zwraca ['bar'], w przeciwnym razie pusta tablica [].

Następnie rozprzestrzeniliśmy się ..., wynikowa tablica (z operacji torturalnej) i elementy tablicy są pchane do tablicy nadrzędnej.

Jeśli nie ma żadnych elementów tablicy (gdy sprawdzanie trunkowania jest false), nic nie zostanie naciśnięte, co jest naszym celem.


W innej odpowiedzi wyjaśniłem ten sam pomysł, ale dla obiektów. Możesz sprawdzić go zbyt Tutaj.

270
Jordan Enev 20 lipiec 2018, 15:17

Jeśli używasz Array.push

Możesz śledzić

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

Wynik jest ["1"]

Lub

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

Wynik jest ["1","2"]

-1
nuclear 22 październik 2018, 13:51

Jeśli używasz ES6, sugerowałbym

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

Ta tablica będzie zawierała tylko wartość "Van", jeśli nazwa jest równa "Van", w przeciwnym razie zostanie odrzucona.

0
Naxxa Consulting 23 lipiec 2019, 06:53

Alternatywne podejście: Pre filtr wypełniony zamiast filtrowania postu:

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

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

Zwroty

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

Wiem, że nie rozwiązuje niewielkich notacji (ponieważ nie będzie działać bez względu na to, co próbujesz), ale zbliża się do tego.

0
Jankapunkt 4 lipiec 2017, 14:41

Jest kilka różnych sposobów, ale sposób, w jaki robisz to naprawdę nie działa dla JavaScript.

Najłatwiejszym rozwiązaniem byłoby mieć oświadczenie IF.

if (myCond) arr.push(element);

Jest też filter, ale nie sądzę, żeby to w ogóle chcesz, ponieważ wydaje się, że będziesz iść na "dodaj tę jedną rzecz, jeśli ten obiekt jest prawdziwy", zamiast sprawdzać wszystko wobec jakiegoś stanu. Chociaż, jeśli chcesz się naprawdę dziwić, możesz to zrobić (nie polecam, ale jest fajnie, że możesz).

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

Zasadniczo po prostu odfiltuje wszystkie wartości nieważne.

2
Adam LeBlanc 4 lipiec 2017, 14:19

Nie masz tak wielu opcji innych niż przy użyciu {x0}}:

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

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

Innym pomysłem jest potencjalnie dodawanie null i filtrowanie ich:

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

myArr = myArr.filter((item) => item !== null);
6
Alberto Trindade Tavares 29 grudzień 2019, 16:58

Jeśli naprawdę chcesz zachować go jako jedną liniową, możesz użyć:

const cond = true;
const myArr = ["foo"].concat(cond ? ["bar"] : []);
8
James Thorpe 4 lipiec 2017, 14:12

Możesz spróbować z prostym, jeśli:

if(cond) {
    myArr.push("bar");
}
10
Sylvain Attoumani 4 lipiec 2017, 14:11

Zrobiłbym to

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

Należy również usunąć, że usunie to również Falsy wartości, takie jak puste struny.

26
Michael Bergquist Suarez 11 listopad 2018, 14:15
const cond = false;
const myArr = ["foo", cond ? "bar" : null].filter(Boolean);

console.log(myArr)

Spowoduje ["foo"]

4
Westman 27 maj 2020, 07:53