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

JavaScript如何根据数组字段元素匹配次数对对象排序

问题描述

现有两个包含fruits、vegs两个数组字段的对象,示例代码如下:

const list1 = {
  name: 'list-1',
  fruits: ['banana', 'strawberry', 'cherry'],
  vegs: ['lettuce', 'avocado', 'beans']
};

const list2 = {
  name: 'list-2',
  fruits: ['banana', 'apple', 'orange', 'watermelon'],
  vegs: ['potato', 'avocado', 'onion', 'cabbage']
};

传入两个目标匹配数组,分别为水果数组、蔬菜数组,示例如下:

const fruits = ['banana', 'strawberry'];
const vegetables = ['potato', 'lettuce', 'avocado'];

排序要求:与传入的水果、蔬菜数组匹配元素总数最多的对象排在首位。以上述示例为例,list1的fruits字段匹配到banana、strawberry共2个元素,vegs字段匹配到lettuce、avocado共2个元素,总匹配数为4;list2总匹配数仅为2,因此排序后list1应排在首位。

最高效实现方案

核心性能优化逻辑是将待匹配的目标数组提前转换为Set结构:Set的元素查找时间复杂度为O(1),相比数组includes方法O(n)的查找效率,在数据量较大时性能差距可达数十倍。

基础实现(适合常规数据量场景)

function sortByMatchCount(lists, targetFruits, targetVegs) {
  // 仅执行一次Set转换,后续所有查找都是O(1)
  const fruitSet = new Set(targetFruits);
  const vegSet = new Set(targetVegs);

  // 计算单个对象的总匹配数
  const calcMatch = (item) => {
    let count = 0;
    for (const f of item.fruits) if (fruitSet.has(f)) count++;
    for (const v of item.vegs) if (vegSet.has(v)) count++;
    return count;
  };

  // 按匹配数降序排列
  return lists.sort((a, b) => calcMatch(b) - calcMatch(a));
}

// 调用测试
const res = sortByMatchCount([list1, list2], fruits, vegetables);
console.log(res[0].name); // 输出 list-1,符合预期

大数据量优化版本

如果待排序的对象数量过百,Array.sort的比较函数会多次触发同一个对象的匹配数计算,造成冗余开销。可以提前遍历一次所有对象,缓存每个对象的匹配值后再排序,性能还能再提升30%以上:

function sortByMatchCountBigData(lists, targetFruits, targetVegs) {
  const fruitSet = new Set(targetFruits);
  const vegSet = new Set(targetVegs);

  return lists
    .map(item => {
      let count = 0;
      for (const f of item.fruits) if (fruitSet.has(f)) count++;
      for (const v of item.vegs) if (vegSet.has(v)) count++;
      return { source: item, matchCount: count };
    })
    .sort((a, b) => b.matchCount - a.matchCount)
    .map(i => i.source);
}

性能对比

  • 嵌套使用数组includes的朴素实现:时间复杂度为O(N*(M+K)),N为所有待排序对象的元素总长度,M、K分别为目标水果、蔬菜数组长度,每一次匹配判断都要遍历目标数组
  • 上述Set实现:时间复杂度为O(N+M+K),所有元素仅需遍历1-2次,匹配判断为常数级操作,数据量越大优势越明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:22:18