我正在尝试改善编码方式,因此尝试重构以下代码:
编辑我的问题是短路评估的最佳做法是什么https://codeburst.io/javascript-what-is-short-circuit-evaluation-ff22b2f5608c
var idArray = [
{ id: 15 },
{ id: -1 },
{ id: 0 },
{ id: 3 },
{ },
{ id: null },
{ id: NaN },
{ id: 'undefined' }
]
let idFilteredArray0 = []
idArray.forEach(idObj =>{
if(typeof idObj.id === 'number' && !isNaN(idObj.id))
idFilteredArray0.push(idObj.id)
})
// from a forEach loop which returns [ 15, -1, 0, 3, 12.2 ]
let idF0 = idArray.reduce((acc, obj) => {
if((obj.id || obj.id) && !isNaN(obj.id))
acc.push(obj.id)
return acc
},[])
// to reduce which returns [15, -1, 3, 12.2]
我 认为 是个问题,但我看不出有其他方法可以排除NaN值。现在,我愿意将0
返回到结果数组中。最后,如果有人知道学习短路评估的好资源,我将不胜感激。谢谢。
J。
答案 0 :(得分:1)
您可以过滤和映射项目,并检查类型和ID,其值不是NaN
。
var idArray = [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }, {}, { id: null }, { id: NaN }, { id: 'undefined' }],
idFiltered = idArray
.filter(({ id }) => typeof id === 'number' && !isNaN(id))
.map(({ id }) => id);
console.log(idFiltered);
答案 1 :(得分:0)
if(obj.id)
为false
时, obj.id
将返回0
。您应该将其重构为零:
let idF0 = idArray.reduce((acc, obj) => {
if(typeof obj.id === 'number' && !isNaN(obj.id))
acc.push(obj.id)
return acc
},[])
如果您想获得更多性能,请考虑以下解决方案,该解决方案以线性时间复杂度运行,例如.reduce()
,但比.reduce()
解决方案快得多:
let idF0 = [], i = 0, length = idArray.length, id;
for (; i < length; i++) {
id = idArray[i].id;
if (id === 'number' && !isNaN(id)) {
idF0.push(id);
}
}
return idF0;