1

我有一个for-of循环,它是这样的:

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

现在由于某种原因 ifsomeArray[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;
    }
}

还有比这更简洁的解决方案吗?

4

6 回答 6

1

这更简洁:

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

基本上,如果someArray[0].properties未定义,则使用空数组而不是引发错误。

于 2017-10-30T14:22:42.057 回答
1

这里有3个对我有用。我更喜欢第三个循环,因为它更清晰。

将 someArray.properties 设置为 null 或 undefined 不会导致循环和错误。

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

于 2017-10-30T14:29:37.007 回答
0

我认为最好的,简单明了的方法是:

if (typeof someArray[0].properties !== 'undefined') {
  for (const val of someArray[0].properties) {
      //
  }
}
于 2017-10-30T14:18:45.093 回答
0

最常见的方法是使用(maybe_null || {}).property,例如:

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

如果使用e而不是empty. :-) 或者通过使用{}而不是变量,这可能会使运行时成本增加一小部分。

于 2017-10-30T14:20:02.227 回答
0
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 : {}) {
}
于 2017-10-30T14:15:10.053 回答
0

这可能不是最干净的解决方案,但我想这是您正在寻找的:

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

顺便提一句。我不会使用这种方法,因为它有点不可读。Imo Vladimir Kovpak 的回答非常直截了当,最终得到了更易于维护的代码。

于 2017-10-30T15:03:46.913 回答