ECMAScript 5下使用filter函数按双条件过滤对象数组
实现方案
在ECMAScript 5环境下,你可以借助Array.prototype.indexOf()替代includes()完成存在性判断,结合filter()函数实现需求:
// 原数组 var originalArray = [ {id: 1, level: 0, name: 'A'}, {id: 2, level: 1, name: 'B'}, {id: 3, level: 1, name: 'S'}, {id: 4, level: 0, name: 'A'}, {id: 5, level: 0, name: 'S'}, {id: 6, level: 1, name: 'A'}, {id: 7, level: 0, name: 'B'} ]; // 目标name集合 var targetNames = ['B', 'S']; // 执行过滤 var filteredArray = originalArray.filter(function(item) { // 满足level为0,或name在targetNames数组中 return item.level === 0 || targetNames.indexOf(item.name) !== -1; }); console.log(filteredArray);
逻辑说明
filter()会遍历数组,仅保留回调函数返回true的元素- ES5中无
includes()方法,用indexOf()判断元素是否存在:目标数组包含指定name时,indexOf()返回非负索引;不存在则返回-1,因此用!== -1确认元素存在 - 过滤采用或条件:只要
level等于0,或者name属于['B','S'],该元素就会被保留
执行代码后得到的结果与你期望一致:
[ {id: 1, level: 0, name: 'A'}, {id: 2, level: 1, name: 'B'}, {id: 3, level: 1, name: 'S'}, {id: 4, level: 0, name: 'A'}, {id: 5, level: 0, name: 'S'}, {id: 7, level: 0, name: 'B'} ]
内容的提问来源于stack exchange,提问作者Sebastien Chemouny
相关产品推荐
相关产品推荐

