Как написать более краткий цикл 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 Ответ Владимира Ковпака довольно прост, и в итоге получается гораздо более понятный код.