You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Underscore.js新手求教:用_.has()筛选匹配JSON记录问题

解决Underscore.js匹配JSON记录的问题

嘿,我来帮你理清楚这个问题~

首先,你的代码返回所有记录的原因主要有两个关键错误:

  1. 错误使用_.has:你写的_.has(all_rec, "first_name")是在检查数组对象本身有没有first_name属性,而不是检查数组里的单个记录。数组本身没有这类属性,所以这个判断永远返回false,导致每个条件分支都走了: true,最后整个表达式的结果是true。而_.where如果传入true作为匹配条件,会认为所有元素都满足,自然返回全部记录。
  2. _.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:42:37