求助:如何基于动态属性值过滤数组并删除指定对象
解决动态属性数组的过滤问题
刚好碰到过类似的场景,要处理这种除了固定id外其他属性都是动态的数组过滤,核心就是要判断对象里除id外的所有属性值是否不全为0。直接用数组的filter方法结合对象遍历就能搞定,给你两种靠谱的实现思路:
方法一:遍历键值对(最稳妥)
这种方式通过键名明确排除id,完全不会受属性值或属性顺序影响,我平时处理这类场景首选这个:
const data = [ {id: 112, cat: 0, dog: 0}, {id: 114, cat: 0, dog: 1}, {id: 115, tiger: 5, dog: 0}, {id: 116, tiger: 0, lion: 3}, {id: 117, tiger: 0, lion: 0} ]; const output = data.filter(item => { // 遍历对象的每个键值对,只要找到一个非id且值不为0的属性,就保留该对象 return Object.entries(item).some(([key, value]) => key !== 'id' && value !== 0); }); console.log(output);
代码逻辑拆解:
filter:负责筛选数组,只保留符合条件的元素Object.entries(item):把对象转换成[键, 值]的数组形式,方便遍历所有属性some:只要有一个元素满足条件就返回true——这里的条件是「属性不是id,且属性值不等于0」,也就是说只要对象里有至少一个非id属性的值不为0,就会被保留下来
方法二:过滤属性值(简洁但需注意边界)
如果能确定没有其他属性的值会和id相等,也可以用这种更简洁的写法:
const output = data.filter(item => { // 取出所有属性值,排除id对应的值后,检查是否存在非0的元素 return Object.values(item).filter(val => val !== item.id).some(val => val !== 0); });
不过这种方式有个小风险:如果某个动态属性的值刚好和当前对象的id相等,会被误判成id属性过滤掉,所以还是第一种方法更安全。
测试两种方法,输出结果都是你想要的:
[ {id: 114, cat: 0, dog: 1}, {id: 115, tiger: 5, dog: 0}, {id: 116, tiger: 0, lion: 3} ]
内容的提问来源于stack exchange,提问作者Deepika Deepi
相关产品推荐
相关产品推荐

