Как определить массив с условными элементами?

как я могу определить элементы условного массива? Я хочу сделать что-то вроде этого:

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

это работает как ожидалось: ["foo", "bar"]

Но если я устанавливаю cond в false, я получаю следующий результат: ["foo", false]

Как я могу определить массив с условным элементом?

Ответ 1

Вы можете распространять массив внутри массива, чтобы сохранить массив элементов в чистоте, когда условие false.

Вот как вы можете это сделать:

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

console.log(items)

Ответ 2

Я бы сделал это

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

Обратите внимание, что это также удалит ложные значения, такие как пустые строки.

Ответ 3

Вы можете попробовать с простым, если:

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

Ответ 4

Если вы действительно хотите сохранить его как один лайнер, вы можете использовать:

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

Ответ 5

У вас не так много вариантов, кроме использования push:

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

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

Другая идея - это потенциально добавить нуль и отфильтровать их:

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

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

Ответ 6

Есть несколько разных способов, но способ, которым вы это делаете, не будет работать для Javascript.

Самое простое решение - просто иметь оператор if.

if (myCond) arr.push(element);

Там также filter, но я не думаю, что вы вообще этого хотите, поскольку вы, кажется, собираетесь "Добавить это одно, если это одно условие истинно", а не проверять все на какое-то условие, Хотя, если вы хотите стать действительно причудливым, вы можете это сделать (не рекомендую, но это круто, что вы можете).

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

В принципе, он просто отфильтрует все неверные значения.

Ответ 7

Однострочник с ES6;

arr = [
  "Hello",
  "World",
  ...(true && ["conditional element"])
]

Ответ 8

Альтернативный подход: предварительный фильтр заполняется вместо фильтрации по почте:

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

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

Возвращает

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

Я знаю, что не решает сокращенную нотацию (поскольку она не будет работать независимо от того, что вы пытаетесь), но она приближается к этому.

Ответ 10

если вы используете es6, я бы предложил

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

Этот массив будет содержать значение "van" только в том случае, если name равно "van", в противном случае он будет отброшен.

Ответ 11

если вы используете Array.push

Вы можете следовать

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

Результат ["1"]

или же

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

Результат - ["1","2"]