向下投票是可以的,但至少让我知道你为什么考虑这样做。
我有学习的热情,想看看是否有其他解决方案,这就是为什么我在预研中问这个问题
我正在将一些"在运行时存储数据"的现有代码从"Object"重构为"Map"(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/)。
目标是在不返回结果的情况下处理给定的运行时数据
由于filter
和map
可以应用于Object.keys
,因此开发人员可以清楚地了解流程内部的逻辑。
旧代码样本,
Object.keys(givenObj)
.filter(key => { return typeof givenObj[key] === 'string' && givenObj[key] !== undefined })
.map( key => { processData(givenObj[key]) } )
很明显,人们理解在做下一步之前应该"过滤"什么。
然而,对于"Map",值的验证似乎只能通过新迭代中的forEach
或values
来完成。
例如,
givenMap.forEach( (value, key) => {
if ( typeof value !== 'string' || value === undefined ){
invalidHandling(key)
} else {
processData(value)
}
})
问题:
if
是否是处理"Map"中undefined
值的唯一方法?
您要问的是"映射/迭代器支持声明式编程吗?">
目前,您所需的内容没有本机支持。你可以在这里看到一些关于它们的讨论。
我看到人们采取的四种选择是:
a。只需使用if else
语句
这不是一个糟糕的选择,但有些人只是觉得这会扰乱他们的情绪。
b。转换为数组,然后返回
这显然不是最高效或最干净的解决方案。
c。添加您自己的filter
和map
方法
在Map
或iterator
上,并实际扩展对象(通常不鼓励(,或者使用的函数将其作为自变量。也许可以看看这个堆栈溢出的答案,或者寻找一些库来寻找一些想法(也许wu.js会有所帮助?(。
d。不要使用地图
这并不是一个真正的"选项",但这肯定是一些人得出的结论,所以我想我会列出它,因为他们只是觉得他们已经习惯了地图(还(不支持的流量。