Как написать более краткий цикл for-of

У меня есть for-of цикл, который выглядит так:

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

Теперь по какой-то причине, если someArray[0].properties неопределен, цикл прерывается, говоря:

Не удается прочитать свойство Symbol(Symbol.iterator) из неопределенного

Если я попытаюсь использовать !! сокращение для логических операторов:

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

это снова не удается.

Единственное решение, которое я мог придумать, было:

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

Есть ли более краткое решение, чем это?

6 ответов

Решение

Это более кратко:

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

В основном, если someArray[0].properties не определено, вместо него используется пустой массив, выдающий ошибку.

Вот 3, которые работают для меня. Я предпочитаю 3-й цикл, так как он понятнее.

Если для someArray.properties задано значение null или неопределенное, это не приводит к возникновению цикла и ошибки.

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

Наиболее распространенным подходом является использование (maybe_null || {}).propertyНапример:

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

Это более кратко, если вы используете e вместо empty,:-) Или с помощью {} вместо переменной, которая может увеличить стоимость времени выполнения крошечной долей.

Я думаю, что лучший, простой и понятный способ это:

if (typeof someArray[0].properties !== 'undefined') {
  for (const val of someArray[0].properties) {
      //
  }
}
someArray[0].properties && Object.keys(someArray[0].properties).forEach(function(key){
    var val = someArray[0].properties[key];
    ...
})

альтернативно

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

Возможно, это не самое чистое решение, но я думаю, это то, что вы ищете:

//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);
}

Btw. Я бы не стал использовать этот подход, потому что он не читается. Imo Ответ Владимира Ковпака довольно прост, и в итоге получается гораздо более понятный код.

Другие вопросы по тегам