无需格式化对象数组,如何简洁判断数组或对象数组中是否存在指定值?
问题描述
现有不可修改的数据结构如下:
var x = { // 一个普通数组 data1: ['this', 'that', 'other'], // 结构固定无法修改 data2: [ {name:'joe'}, {name:'john'} ] }
需求是当data1或data2中存在值'joe'时执行代码。直接用x.data2.includes('joe')行不通,因为data2是对象数组,不是字符串数组。目前的做法是写个函数把data2转成普通数组后再用includes判断:
var formatData2 = function(){ var arr = []; for( i in x.data2 ){ arr.push( x.data2[i].name ); } return arr; } if( x.data1.includes('joe') || formatData2().includes('joe') ){...}
想问能不能不用格式化data2成数组,直接在if语句里完成判断?
解决方案
当然可以,用数组的some()方法就能直接判断,不用提前转数组:
if (x.data1.includes('joe') || x.data2.some(item => item.name === 'joe')) { // 这里写要执行的代码 }
some()会遍历数组里的每一项,只要有一个元素满足回调里的条件,就会返回true——刚好匹配你的需求:只要data2里有任意一个对象的name是'joe',就会触发判断为真。
要是需要兼容不支持箭头函数的老浏览器,换成普通函数写法就行:
if (x.data1.includes('joe') || x.data2.some(function(item) { return item.name === 'joe'; })) { // 这里写要执行的代码 }
这样就完全不用额外格式化数组,直接在if条件里搞定判断了。
内容的提问来源于stack exchange,提问作者Rock Erekson
相关产品推荐
相关产品推荐

