comment puis-je définir des éléments de tableau conditionnels? Je veux faire quelque chose comme ceci:
const cond = true;
const myArr = ["foo", cond && "bar"];
cela fonctionne comme prévu: ["foo", "bar"]
Mais si je règle cond
sur false
, j'obtiens le résultat suivant: ["foo", false]
Comment définir un tableau avec un élément conditionnel?
Vous pouvez étendre un tableau à l'intérieur d'un tableau, afin de garder le tableau d'éléments propre, lorsque la condition est false
.
Voici comment vous pouvez le faire:
// Will result in ['foo', 'bar']
const items = [
'foo',
... true ? ['bar'] : [],
... false ? ['falsy'] : [],
]
console.log(items)
Explications:
Comme vous pouvez le voir, l'opérateur ternaire retourne toujours un tableau.
Si la condition est true
, elle renvoie ['bar']
, sinon un tableau vide []
.
Après cela, nous avons étendu ...
le tableau résultant (de l'opération ternaire) et les éléments du tableau sont poussés dans le tableau parent.
S'il n'y a pas d'éléments de tableau (lorsque la vérification ternaire est false
), rien ne sera poussé, ce qui est notre objectif.
Dans une autre réponse, j'ai expliqué la même idée, mais pour les objets. Vous pouvez aussi le vérifier ici .
Je ferais ça
[
true && 'one',
false && 'two',
1 === 1 && 'three',
1 + 1 === 9 && 'four'
].filter(Boolean) // ['one', 'three']
Notez que cela supprimera également les valeurs falsy , telles que les chaînes vides.
Vous pouvez essayer avec un simple si:
if(cond) {
myArr.Push("bar");
}
Vous n'avez pas tant d'options que d'utiliser Push
:
const cond = true;
const myArr = ["foo"];
if (cond) myArr.Push("bar");
Une autre idée est d’ajouter potentiellement des NULL et de les filtrer:
const cond = true;
const myArr = ["foo", cond ? "bar" : null];
myArr = myArr.filter((item) => item !== null);
Si vous (vraiment} _ voulez le conserver comme une ligne, vous pouvez utiliser:
const cond = true;
const myArr = ["foo"].concat(cond ? ["bar"] : []);
Il y a plusieurs façons, mais la façon dont vous le faites ne fonctionnera pas vraiment pour Javascript.
La solution la plus simple serait simplement d’avoir une déclaration if.
if (myCond) arr.Push(element);
Il y a aussi filter
, mais je ne pense pas que ce soit ce que vous voulez du tout, car vous semblez aller pour "Ajoutez ceci, si cette condition est vraie" plutôt que de tout comparer avec certaines conditions. Bien que, si vous voulez devenir vraiment bizarre, vous pouvez le faire (je ne le recommanderais pas, mais c'est cool que vous le puissiez).
var arr = ["a", cond && "bar"];
arr.filter( e => e)
Fondamentalement, il va simplement filtrer toutes les valeurs non vraies.
Une doublure avec ES6;
arr = [
"Hello",
"World",
...(true && ["conditional element"])
]
Approche alternative: pré-filtrage au lieu du post-filtrage:
const populate = function(...values) {
return values.filter(function(el) {
return el !== false
});
};
console.log(populate("foo", true && "bar", false && "baz"))
Résultats
(2) ["foo", "bar"]
Je sais que cela ne résout pas la notation abrégée (car cela ne fonctionnera pas, peu importe ce que vous essayez), mais cela s'en rapproche.
si vous utilisez Array.Push
Vous pouvez faire suivre
var a = ["1"]
a.Push(... !true ? ["2"] : [])
Le résultat est ["1"]
ou
var a = ["1"]
a.Push(... true ? ["2"] : [])
Le résultat est ["1","2"]