JavaScript如何检查对象format属性并为缺失属性的电影对象补值
遍历补全电影format属性的实现方案
先修正你现有代码的两处会导致功能失效的错误
forEach的回调传参写法错误:当前代码写的nmovies.forEach(myfunction())会立即执行myfunction函数,把函数执行后的返回值(此处为undefined)传给forEach作为遍历回调,完全达不到遍历处理数组的效果。正确写法是直接传入函数引用,不要在函数名后加括号。- 属性检查的逻辑误区:不要直接用
if(item.format)判断属性是否存在,这种写法在未来遇到format属性值为空字符串、数值0这类falsy值的场景时,会出现误判,覆盖原本合法的属性值。
完整可运行的实现代码
var fractured={ title:"Fractured", release:2019, rating:8, format:"digital", genre:["Mystery","Sci-Fi","Western"] }; var countdown={ title:"Countdown", release:2018, rating:5, genre:["Sci-Fi","Mystery","Western"] } var bloodshot={ title:"Bloodshot", release:2020, rating:6, format:"digital", genre:["Sci-Fi","Action"] } var revenant={ title:"Revenant", release:2015, rating:3, genre:["History","Western","Action"] } var crisis={ title:"Crisis", release:2016, rating:10, genre:["Action","Drama","Reality"] } var life={ title:"Life", release:2017, rating:9, format:"digital", genre:["Sci-Fi","Action","Mystery"] } var nmovies = [fractured, life, crisis, revenant, bloodshot, countdown]; // 原有测试代码:输出第一个对象的title console.log(nmovies[0].title); // 修正后的遍历调用:直接传函数引用,不立即执行 nmovies.forEach(myFunction); function myFunction(item){ // 严格检查对象自身是否存在format属性 if (!item.hasOwnProperty('format')) { item.format = 'Film'; } } // 验证处理结果:打印所有电影的标题和对应format值 console.log(nmovies.map(movie => `${movie.title}: ${movie.format}`))
更简洁的简写写法
如果不需要单独复用处理逻辑,可以直接把检查逻辑写在forEach的回调里,代码更紧凑:
nmovies.forEach(item => { if (!('format' in item)) item.format = 'Film'; })
注:
'format' in item和hasOwnProperty的区别是,前者会匹配原型链上继承的同名属性,后者只会匹配对象自身的属性——因为你场景里的电影对象都是纯字面量对象,不存在原型继承的format属性,两种写法在这里效果完全一致。
内容的提问来源于stack exchange,提问作者user14187680
相关产品推荐
相关产品推荐

