web-dev-qa-db-fra.com

Comment définir un tableau avec des éléments conditionnels?

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?

33
Manu Schiller

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 .

67
Jordan Enev

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.

7

Vous pouvez essayer avec un simple si:

if(cond) {
    myArr.Push("bar");
}
4
Sylvain Attoumani

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"] : []);
3
James Thorpe

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.

1
Adam LeBlanc

Une doublure avec ES6;

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

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.

0
Jankapunkt

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"]

0
toffee