如何通过对象属性过滤数组对象?devicePaymentMethods过滤失效求助
解决你的设备数组过滤问题
我帮你定位到问题啦!你的filterByValue函数在处理devicePaymentMethods时有两个关键问题,导致搜索"ab"得不到预期结果:
- 没有返回判断结果:你在遍历
devicePaymentMethods时用了map,但没有把匹配的结果返回给外层的some函数,这个分支相当于没有输出,自然不会触发过滤匹配。 - 用错了数组方法:我们只需要判断数组里有没有符合条件的元素,
map是用来转换数组元素的,而some才是专门用来检测“是否存在至少一个匹配项”的方法,而且效率更高——找到第一个匹配项就会停止遍历。
修复后的完整代码
const devices = [{ deviceLocation: { label: "Pure", value: "pure" }, deviceName: "test7", devicePaymentMethods: [{ label: "ab", value: "ab" }, { label: "cd", value: "cd" }, { label: "ef", value: "ef" }], deviceType: "iPad", id: "001", connected: false, enabled: false }, { deviceLocation: { label: "kandy", value: "kandy" }, deviceName: "test4", devicePaymentMethods: [{ label: "ab", value: "ab" }, { label: "cd", value: "cd" }], deviceType: "iPad", id: "004", connected: false, enabled: false } ]; const filterByValue = (array, string) => { // 提前把搜索字符串转小写,避免重复计算,提升性能 const searchStr = string.toLowerCase(); return array.filter(device => // 匹配设备名称 device.deviceName.toLowerCase().includes(searchStr) || // 匹配设备位置的label device.deviceLocation.label.toLowerCase().includes(searchStr) || // 匹配支付方式的label:只要有一个匹配就返回true device.devicePaymentMethods.some(payMethod => payMethod.label.toLowerCase().includes(searchStr) ) ); }; // 测试:调用后会返回两个设备,因为它们都包含"ab"支付方式 console.log(filterByValue(devices, "ab"));
额外优化说明
我还做了一点小优化:提前把搜索字符串转成小写,避免在每个判断分支里重复调用toLowerCase(),这样能减少不必要的计算,尤其是当数组很大的时候效果更明显。另外,直接针对三个需要过滤的属性做判断,比用Object.keys(o).some()遍历所有键更直观,也避免了处理id、connected这些我们不需要过滤的属性。
现在你再调用filterByValue(devices, "ab")就能得到预期的两个设备了;如果搜索"ef",只会返回第一个设备,完全符合需求~
内容的提问来源于stack exchange,提问作者nurwadula
相关产品推荐
相关产品推荐

