如何用JavaScript按数组所有值过滤数据?代码问题求助
根据服务数组过滤匹配的服务项
你的思路方向是对的,但现有代码里有两个关键问题导致过滤逻辑不生效:
arrayOfServices.values()返回的是数组迭代器对象,不是具体的服务名称字符串,includes方法没法和这个迭代器做有效匹配- 逻辑方向搞反了:你需要检查「数组里的任意一个服务名称是否被包含在当前项的
service.name中」,而不是反过来判断service.name是否包含迭代器
给你修正后的可运行代码:
filterPrestationsByServiceSelected(arrayOfServices) { console.log(arrayOfServices); // ['Repassage', 'Couture'] this.filteredPrestationsByService = this.filteredPrestations.filter(item => { // 用some()遍历服务数组,只要有一个名称被包含就保留当前项 return arrayOfServices.some(serviceName => item.service.name.includes(serviceName)); }); }
关键逻辑解释:
arrayOfServices.some(...):遍历传入的服务数组,只要有一个元素满足条件就返回true,这样filter就会把当前item保留下来item.service.name.includes(serviceName):检查当前项的服务名称是否包含数组中的某个关键词(如果需要忽略大小写,可以转成统一大小写:item.service.name.toLowerCase().includes(serviceName.toLowerCase()))
额外优化:处理空数组场景
如果用户没有选中任何服务(arrayOfServices为空),可以直接返回所有已过滤的项,避免空数组导致没有结果返回:
filterPrestationsByServiceSelected(arrayOfServices) { console.log(arrayOfServices); // ['Repassage', 'Couture'] // 空数组时返回全部已过滤项 if (!arrayOfServices.length) { this.filteredPrestationsByService = [...this.filteredPrestations]; return; } this.filteredPrestationsByService = this.filteredPrestations.filter(item => { return arrayOfServices.some(serviceName => item.service.name.toLowerCase().includes(serviceName.toLowerCase()) ); }); }
这样就能完美实现你要的「保留所有service.name包含数组中任意值的项」的需求啦。
内容的提问来源于stack exchange,提问作者Tony S
相关产品推荐
相关产品推荐

