Tengo un bucle for - of que dice así:

for(const val of someArray[0].properties) {
 // some processing;
}

Ahora, por alguna razón, si someArray[0].properties no está definido, el bucle se rompe y dice:

No se puede leer la propiedad 'Símbolo (Symbol.iterator)' de indefinida

Si trato de usar la abreviatura !! para operadores booleanos:

for (const val of !!someArray[0].properties && someArray[0].properties) {
}

Falla nuevamente.

La única solución que se me ocurrió fue:

if(someArray[0].properties){ // this will check for that undefined issue
    for(const val of someArray[0].properties) {
     // some processing;
    }
}

¿Existe una solución más concisa que esta?

1
Saras Arya 30 oct. 2017 a las 17:11

6 respuestas

La mejor respuesta

Esto es más conciso:

for (const val of someArray[0].properties || []) {
  // some processing
}

Básicamente, si someArray[0].properties no está definido, se usa la matriz vacía en lugar de arrojar un error.

1
John Kennedy 30 oct. 2017 a las 14:22

Puede que esta no sea la solución más limpia, pero supongo que es lo que estás buscando:

//init
const someArray = [{
  properties: {
    a:'1',
    b: 2,
    c:undefined
  }
}];

const props = someArray[0].properties;

for (const val of Object.keys(props).filter(x => props[x]).map(x => {
  const a = {};
  a[x] = props[x];
  return a;
})) {
  console.log(val);
}

Por cierto. No usaría este enfoque porque es un poco ilegible. La respuesta de Imo Vladimir Kovpak es bastante sencilla, lo que termina en un código mucho más fácil de mantener.

0
Werner 30 oct. 2017 a las 15:33
someArray[0].properties && Object.keys(someArray[0].properties).forEach(function(key){
    var val = someArray[0].properties[key];
    ...
})

Alternativamente

for (const val of someArray[0].properties ? someArray[0].properties : {}) {
}
0
TKoL 30 oct. 2017 a las 14:15

Aquí hay 3 que funcionan para mí. Prefiero el tercer ciclo ya que es más claro.

Establecer someArray.properties en resultados nulos o indefinidos sin bucle ni error.

<script>
var someArray = [{ properties : [1,2] }]

for(const val of someArray[0].properties ? someArray[0].properties : []) {
   console.log("1")
}

var props = someArray[0].properties
for(const val of props ? props : []) {
   console.log("2")
}

for (const val of someArray[0].properties || []) {
  console.log("3")
}
</script>
1
EamonnM 30 oct. 2017 a las 14:40

El enfoque más común es usar (maybe_null || {}).property, por ejemplo:

var empty = {};
((someArray || empty)[0] || empty).properties || empty

Es más conciso si usa e en lugar de empty. :-) O usando {} en lugar de una variable, lo que puede aumentar el costo de tiempo de ejecución en una pequeña fracción.

0
kay - SE is evil 30 oct. 2017 a las 14:20

Creo que la mejor manera, simple y clara es:

if (typeof someArray[0].properties !== 'undefined') {
  for (const val of someArray[0].properties) {
      //
  }
}
0
V. Kovpak 30 oct. 2017 a las 14:18