如何写一个更简洁的for-of循环
How to write a more concise for-of loop
我有一个 for
-of
循环,它是这样的:
for(const val of someArray[0].properties) {
// some processing;
}
现在由于某种原因,如果 someArray[0].properties
未定义,循环中断,说:
Cannot read property 'Symbol(Symbol.iterator)' of undefined
如果我尝试将 !!
shorthand 用于布尔运算符:
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;
}
}
还有比这更简洁的解决方案吗?
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 : {}) {
}
我认为最好的、简单明了的方法是:
if (typeof someArray[0].properties !== 'undefined') {
for (const val of someArray[0].properties) {
//
}
}
最常见的方法是使用 (maybe_null || {}).property
,例如:
var empty = {};
((someArray || empty)[0] || empty).properties || empty
用e
代替empty
会更简洁。 :-) 或者使用 {}
而不是变量,这可能会增加一小部分运行时成本。
这样更简洁:
for (const val of someArray[0].properties || []) {
// some processing
}
基本上,如果 someArray[0].properties
未定义,则使用空数组而不是抛出错误。
这里有 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>
这可能不是最干净的解决方案,但我想这就是您要找的:
//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 的回答非常简单,最终代码更易于维护。
我有一个 for
-of
循环,它是这样的:
for(const val of someArray[0].properties) {
// some processing;
}
现在由于某种原因,如果 someArray[0].properties
未定义,循环中断,说:
Cannot read property 'Symbol(Symbol.iterator)' of undefined
如果我尝试将 !!
shorthand 用于布尔运算符:
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;
}
}
还有比这更简洁的解决方案吗?
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 : {}) {
}
我认为最好的、简单明了的方法是:
if (typeof someArray[0].properties !== 'undefined') {
for (const val of someArray[0].properties) {
//
}
}
最常见的方法是使用 (maybe_null || {}).property
,例如:
var empty = {};
((someArray || empty)[0] || empty).properties || empty
用e
代替empty
会更简洁。 :-) 或者使用 {}
而不是变量,这可能会增加一小部分运行时成本。
这样更简洁:
for (const val of someArray[0].properties || []) {
// some processing
}
基本上,如果 someArray[0].properties
未定义,则使用空数组而不是抛出错误。
这里有 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>
这可能不是最干净的解决方案,但我想这就是您要找的:
//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 的回答非常简单,最终代码更易于维护。