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

如何优化判断数组对应对象属性值全相同的JS samePrice函数

samePrice 函数优化方案

需求说明

实现samePrice(arr, obj)函数,判断数组arr中所有元素作为键对应的对象obj的值是否完全相等,示例逻辑如下:

const arr = [0,1,2];
const obj = {
    0: 10,
    1: 10,
    2: 10,
    3: 12,
};
// samePrice(arr,obj) => true

const arr2 = [0,3];
const obj2 = {
    0: 10,
    1: 10,
    2: 10,
    3: 12,
};
// samePrice(arr2,obj2) => false

原实现存在的问题

你当前的版本用forEach遍历存在两个明显问题:

  • 无法提前终止遍历:哪怕已经找到值不相等的元素,还是会遍历完整个数组,数组长度大时性能浪费明显
  • 缺少边界处理:如果传入的arr是空数组,会取obj[undefined]作为基准值,逻辑不符合预期

更优实现

推荐使用Array.every()实现,天然支持短路终止,代码语义更强:

const samePrice = (arr, obj) => {
  // 空数组可根据业务需求调整返回值,这里默认返回true
  if (arr.length === 0) return true
  const basePrice = obj[arr[0]]
  return arr.every(key => obj[key] === basePrice)
}

优化点说明

  • 性能更好:只要遇到不相等的值就立即停止遍历,无需走完整个数组
  • 语义清晰:every方法本身就是用来校验所有元素是否满足规则,不需要额外定义临时变量存储结果,代码更简洁易读
  • 兼容边界场景:单独处理空数组输入的情况,避免出现非预期的返回结果

简洁版写法(适合短数组场景)

如果追求代码极致简洁,且输入数组长度普遍较短,也可以用Set实现:

// 空数组时Set size为0,也满足<=1的条件,符合默认返回true的逻辑
const samePrice = (arr, obj) => new Set(arr.map(key => obj[key])).size <= 1

这种写法代码更短,但因为要遍历所有元素生成Set后才能判断,没有短路机制,长数组场景下性能低于every版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:36:04