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

JavaScript中按字段优先级搜索对象数组的实现方案

实现带字段优先级的多属性搜索

需求场景

给定如下对象数组:

var array = [
{ 
  name: "John",
  surname: "Doe",
  title: "mister"
},
{ 
  name: "Jane",
  surname: "Smith",
  title: "miss"
},
{ 
  name: "Doe",
  surname: "Mustermann",
  title: "mister"
}
]

需要实现带字段优先级的多属性搜索:搜索结果中,高优先级字段匹配的对象排在前面。例如搜索关键词"Doe"时,name字段匹配的Doe Mustermann要排在surname字段匹配的John Doe之前。

解决方案

核心思路是给每个匹配项计算优先级分数,再按分数排序。具体步骤:

  1. 先过滤出所有包含关键词的对象;
  2. 为每个匹配对象计算其最高匹配字段对应的优先级分数;
  3. 按分数从高到低排序(分数越高,字段优先级越高)。

完整代码实现:

// 定义字段优先级:顺序越靠前,优先级越高
const fieldPriority = ['name', 'surname', 'title'];

function searchWithPriority(array, keyword) {
  // 第一步:过滤出所有匹配关键词的项(不区分大小写)
  const matchedItems = array.filter(item => {
    return Object.values(item).some(val => 
      val.toLowerCase().includes(keyword.toLowerCase())
    );
  });

  // 第二步:计算每个匹配项的最高优先级分数并排序
  return matchedItems.sort((a, b) => {
    // 获取单个对象的最高匹配优先级分数
    const getMatchScore = (item) => {
      for (let i = 0; i < fieldPriority.length; i++) {
        const field = fieldPriority[i];
        if (item[field].toLowerCase().includes(keyword.toLowerCase())) {
          // 优先级越高,分数越高(比如第一个字段得3分,第二个2分)
          return fieldPriority.length - i;
        }
      }
      return 0; // 已过滤匹配项,此分支不会触发
    };

    const scoreA = getMatchScore(a);
    const scoreB = getMatchScore(b);

    // 分数高的排前面,分数相同则保留原数组顺序
    return scoreB - scoreA;
  });
}

// 测试调用
const result = searchWithPriority(array, "Doe");
console.log(result);

代码说明

  • 字段优先级定义:fieldPriority数组的顺序决定了字段优先级,可根据需求调整;
  • 过滤逻辑:用filter+some筛选出任意字段包含关键词的对象,toLowerCase实现不区分大小写搜索;
  • 分数计算:遍历优先级字段,找到第一个匹配的字段,给它分配对应分数(优先级越高分数越高);
  • 排序逻辑:通过比较分数,让高优先级匹配的对象排在前面,分数相同时保持原数组顺序(稳定排序)。

常见问题修正

之前用filter+sort失败,大概率是没有基于匹配字段的优先级来设计排序逻辑,而是直接比较字符串或单一字段。通过引入优先级分数,可以精准控制排序规则,满足需求。

内容的提问来源于stack exchange,提问作者Zookeeper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:15:28