如何优化判断数组对应对象属性值全相同的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
相关产品推荐
相关产品推荐

