Underscore.js新手求教:用_.has()筛选匹配JSON记录问题
解决Underscore.js匹配JSON记录的问题
嘿,我来帮你理清楚这个问题~
首先,你的代码返回所有记录的原因主要有两个关键错误:
- 错误使用
_.has:你写的_.has(all_rec, "first_name")是在检查数组对象本身有没有first_name属性,而不是检查数组里的单个记录。数组本身没有这类属性,所以这个判断永远返回false,导致每个条件分支都走了: true,最后整个表达式的结果是true。而_.where如果传入true作为匹配条件,会认为所有元素都满足,自然返回全部记录。 _.where不适合自定义匹配逻辑:_.where只能做简单的“匹配所有指定键值对”的筛选,而你需要的是更灵活的匹配规则,这时候用_.filter才是正确的选择。
正确的实现方案
根据你的预期需求(找出至少和input有一个字段匹配的记录),可以用以下Underscore代码实现:
const input = {first_name: "John", surname: "Paul", email: "john.paul@gmail.com"}; const all_rec = [ {"id": 1,"first_name": "John","surname": "Paul","email": "john.paul@gmail.com"}, {"id": 2,"first_name": "Kerry","surname": "Morrison","phone": "43567823"}, {"id": 3,"first_name": "John", "phone": "0345433234"} ]; // 获取input的所有字段名 const inputFields = _.keys(input); // 用_.filter筛选符合条件的记录 const resultData = _.filter(all_rec, function(record) { // 检查当前记录是否有至少一个字段在input中存在,且值完全匹配 return _.some(inputFields, function(field) { return _.has(record, field) && record[field] === input[field]; }); }); console.log(resultData); // 输出结果:包含id为1和3的记录
代码解释
_.keys(input):提取input的所有字段名,得到数组["first_name", "surname", "email"]_.filter:遍历all_rec数组,对每个记录执行自定义判断逻辑_.some:检查input的字段中,是否存在至少一个字段满足「记录有该字段,且值和input对应字段相等」。只要有一个满足,该记录就会被保留。
如果你的需求是更严格的匹配(比如input中的所有字段,只要记录有该字段就必须值匹配),可以调整判断逻辑:
const resultData = _.filter(all_rec, function(record) { // 确保input的所有字段,只要记录有就必须值匹配 const allRequiredMatch = _.every(inputFields, function(field) { return !_.has(record, field) || record[field] === input[field]; }); // 确保至少有一个字段是匹配的(排除完全不相关的记录) const hasAtLeastOneMatch = _.some(inputFields, function(field) { return _.has(record, field) && record[field] === input[field]; }); return allRequiredMatch && hasAtLeastOneMatch; });
内容的提问来源于stack exchange,提问作者user3362908
相关产品推荐
相关产品推荐

