как я могу определить элементы условного массива? я хочу сделать что-то вроде этого:
const cond = true;
const myArr = ["foo", cond && "bar"];
это работает как ожидалось: ["foo", "bar"]
Но если установить cond
на false
, я получаю следующий результат:["foo", false]
Как я мог определить массив с условным элементом?
javascript
arrays
Ману Шиллер
источник
источник
Ответы:
Вы можете распределить массив внутри массива, чтобы сохранить массив элементов в чистоте, когда условие есть
false
.Вот как это сделать :
// Will result in ['foo', 'bar'] const items = [ 'foo', ... true ? ['bar'] : [], ... false ? ['falsy'] : [], ] console.log(items)
Пояснения :
Как видите, тернарный оператор всегда возвращает массив.
Если условие -
true
возвращается['bar']
, в противном случае - пустой массив[]
.После этого мы распределяем
...
полученный массив (из тернарной операции), и элементы массива помещаются в родительский массив.Если элементов массива нет (когда есть тройная проверка
false
), то ничего не будет отправлено , что и является нашей целью.В другом ответе я объяснил ту же идею, но для объектов. Вы тоже можете проверить это здесь .
источник
Я бы сделал это
[ true && 'one', false && 'two', 1 === 1 && 'three', 1 + 1 === 9 && 'four' ].filter(Boolean) // ['one', 'three']
Обратите внимание, что это также удалит ложные значения, такие как пустые строки.
источник
Вы можете попробовать простое, если:
if(cond) { myArr.push("bar"); }
источник
Если вы действительно хотите сохранить его как один лайнер, вы можете использовать:
const cond = true; const myArr = ["foo"].concat(cond ? ["bar"] : []);
источник
const myArr = (cond ? ['item 1'] : []).concat(['item 2', 'item 3']);
У вас не так много вариантов, кроме использования
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);
источник
const cond = false; const myArr = ["foo", cond ? "bar" : null].filter(Boolean); console.log(myArr)
Результатом будет ["foo"]
источник
Есть несколько разных способов, но то, как вы это делаете, не работает для Javascript.
Самым простым решением было бы иметь оператор if.
if (myCond) arr.push(element);
Также есть
filter
, но я не думаю, что это то, что вы здесь вообще хотите, поскольку вы, кажется, собираетесь «добавить это одно, если это одно условие истинно», а не проверять все на соответствие какому-то условию. Хотя, если вы хотите стать действительно причудливым, вы можете это сделать (не рекомендую, но здорово, что вы можете).var arr = ["a", cond && "bar"]; arr.filter( e => e)
По сути, он просто отфильтрует все неверные значения.
источник
var arr = ["a", cond && "bar"].filter(e => e);
@Adam LeBlanc, но вы правы, это, вероятно, мусор. но крутая фигня;)Альтернативный подход: заполнение Pre-Filter вместо пост-фильтрации:
const populate = function(...values) { return values.filter(function(el) { return el !== false }); }; console.log(populate("foo", true && "bar", false && "baz"))
Возврат
(2) ["foo", "bar"]
Я знаю, что это не решает проблему сокращенной записи (поскольку она не сработает, что бы вы ни пытались), но это близко к этому.
источник
если вы используете es6, я бы посоветовал
let array = [ "bike", "car", name === "van" ? "van" : null, "bus", "truck", ].filter(Boolean);
Этот массив будет содержать значение «van», только если имя равно «van», в противном случае оно будет отброшено.
источник
если вы используете
Array.push
Вы можете следовать
var a = ["1"] a.push(... !true ? ["2"] : [])
Результат
["1"]
или
var a = ["1"] a.push(... true ? ["2"] : [])
Результат
["1","2"]
источник
check
и a,push
ваше решение определенно не будет самым ясным. Я бы придерживалсяif (check) foo.push( item );
вместо того, чтобы распространять пустой массив в случае ложности.