¿Cómo puedo definir elementos de matriz condicional? quiero hacer algo como esto:
const cond = true;
const myArr = ["foo", cond && "bar"];
esto funciona como se esperaba: ["foo", "bar"]
Pero si me puse cond
a false
, me sale el siguiente resultado:["foo", false]
¿Cómo podría definir una matriz con un elemento condicional?
javascript
arrays
Manu Schiller
fuente
fuente
Respuestas:
Puede extender una matriz dentro de una matriz, para mantener limpia la matriz de elementos, cuando la condición es
false
.Así es como puede hacerlo :
// Will result in ['foo', 'bar'] const items = [ 'foo', ... true ? ['bar'] : [], ... false ? ['falsy'] : [], ] console.log(items)
Explicaciones :
Como puede ver, el operador ternario siempre devuelve una matriz.
Si la condición es
true
, regresa['bar']
; de lo contrario, una matriz vacía[]
.Después de eso, distribuimos
...
la matriz resultante (de la operación ternaria) y los elementos de la matriz se envían a la matriz principal.Si no hay elementos de la matriz (cuando la verificación ternaria es
false
), no se enviará nada, que es nuestro objetivo.En otra respuesta expliqué la misma idea, pero para objetos. Puedes comprobarlo también aquí .
fuente
Yo haría esto
[ true && 'one', false && 'two', 1 === 1 && 'three', 1 + 1 === 9 && 'four' ].filter(Boolean) // ['one', 'three']
Tenga en cuenta que esto también eliminará los valores falsos , como cadenas vacías.
fuente
Puedes probar con un simple si:
if(cond) { myArr.push("bar"); }
fuente
Si realmente desea mantenerlo como una sola línea, puede usar:
const cond = true; const myArr = ["foo"].concat(cond ? ["bar"] : []);
fuente
const myArr = (cond ? ['item 1'] : []).concat(['item 2', 'item 3']);
No tienes tantas opciones además de usar
push
:const cond = true; const myArr = ["foo"]; if (cond) myArr.push("bar");
Otra idea es potencialmente agregar nulos y filtrarlos:
const cond = true; const myArr = ["foo", cond ? "bar" : null]; myArr = myArr.filter((item) => item !== null);
fuente
const cond = false; const myArr = ["foo", cond ? "bar" : null].filter(Boolean); console.log(myArr)
Resultará en ["foo"]
fuente
Hay algunas formas diferentes, pero la forma en que lo está haciendo realmente no funcionará para Javascript.
La solución más sencilla sería tener una declaración if.
if (myCond) arr.push(element);
También hay
filter
, pero no creo que eso sea lo que quieres aquí en absoluto, ya que parece que estás optando por "Agregar esta única cosa, si esta única condición es verdadera" en lugar de comparar todo con alguna condición. Aunque, si quieres ponerte realmente raro, puedes hacerlo (no lo recomendaría, pero es genial que puedas).var arr = ["a", cond && "bar"]; arr.filter( e => e)
Básicamente, solo filtrará todos los valores no verdaderos.
fuente
var arr = ["a", cond && "bar"].filter(e => e);
@Adam LeBlanc pero tienes razón, probablemente sea basura. pero basura fresca;)Enfoque alternativo: Prefiltro rellenar en lugar de posfiltrar:
const populate = function(...values) { return values.filter(function(el) { return el !== false }); }; console.log(populate("foo", true && "bar", false && "baz"))
Devoluciones
(2) ["foo", "bar"]
Sé que no resuelve la notación abreviada (ya que no funcionará sin importar lo que intentes) pero se acerca a eso.
fuente
si está usando es6, sugeriría
let array = [ "bike", "car", name === "van" ? "van" : null, "bus", "truck", ].filter(Boolean);
Esta matriz solo contendrá el valor "van" si el nombre es igual a "van", de lo contrario, se descartará.
fuente
si utiliza
Array.push
Puedes seguir
var a = ["1"] a.push(... !true ? ["2"] : [])
El resultado es
["1"]
o
var a = ["1"] a.push(... true ? ["2"] : [])
El resultado es
["1","2"]
fuente
check
y unapush
solución definitivamente no es el que tiene la mayor claridad. Me quedaría con enif (check) foo.push( item );
lugar de extender una matriz vacía en el caso falso.