JavaScript实现filter过滤查询时动态切换判断键名
核心问题
用obj.xxx的点语法访问对象属性时,点后面的内容会被当成固定的字符串键名,不会解析成变量。你写的data[i].var1实际是在找对象里键名就叫var1的属性,但你的数据里根本没有这个键,判断逻辑自然失效。
动态指定键名访问属性,必须用方括号语法:obj[存储键名的变量]。
基础修正版本
改完的代码直接换filterKey的值就能切换过滤的字段,不用改循环里的判断逻辑:
// 要过滤0和null值的键,改这个变量即可 const filterKey = 'year'; const data = [ {"location": 30, "year": 2019}, {"location": 60, "year" : 1928}, {"location": 0, "year": 2019}, {"location": 50, "year": 0} ]; const filteredData = []; for (let i = 0; i < data.length; i++) { const item = data[i]; // 方括号里放变量,就能拿到对应键的值 if (item[filterKey] !== null && item[filterKey] != 0) { // 直接push原对象即可,不用手动逐键复制 filteredData.push(item); } } console.log(filteredData);
扩展:支持同时过滤多个键
如果需要同时校验多个字段(比如location和year都不能是0或null),可以把待过滤的键存成数组,用Array.prototype.filter+every写得更简洁:
// 所有需要过滤0和null的键都放这个数组里,按需增删 const filterKeys = ['location', 'year']; const data = [ {"location": 30, "year": 2019}, {"location": 60, "year" : 1928}, {"location": 0, "year": 2019}, {"location": 50, "year": 0} ]; const filteredData = data.filter(item => { // 所有待校验键都满足「不是null、不是0」才保留条目 return filterKeys.every(key => item[key] !== null && item[key] != 0); }); console.log(filteredData); // 最终只会保留location、year都符合要求的前两条数据
内容的提问来源于stack exchange,提问作者Ant
相关产品推荐
相关产品推荐

