如何验证对象数组中元素属性是否重复?求更优实现方案
优化对象数组指定属性值的出现次数判断
原代码通过filter后判断长度是否不等于1,来实现“目标name值的元素不是恰好出现一次”的判断,以下是几种更简洁高效的实现方式:
方法1:用some提前终止遍历(性能最优)
利用some的特性——一旦回调返回true就立即终止遍历,减少不必要的数组遍历操作,同时兼顾“完全不存在”的情况:
const value = 'a' const value2 = 'c' const arr = [{ name: 'a' }, { name: 'b' }] const checkNonSingle = (arr, target) => { let count = 0; // 先检查是否出现超过1次 const hasDuplicate = arr.some(item => { if (item.name === target) { count++; return count > 1; } return false; }); // 要么重复,要么完全不存在,都返回true return hasDuplicate || count === 0; } console.log(checkNonSingle(arr, value)) // false(恰好出现1次) console.log(checkNonSingle(arr, value2)) // true(完全不存在)
方法2:提取属性数组后用indexOf+lastIndexOf
先把所有name属性提取为字符串数组,通过判断目标值的首次和末次索引是否不同,来快速判断是否重复,同时处理不存在的情况:
const value = 'a' const value2 = 'c' const arr = [{ name: 'a' }, { name: 'b' }] const names = arr.map(item => item.name); const checkNonSingle = (namesArr, target) => { const firstPos = namesArr.indexOf(target); // 不存在 或者 首次和末次位置不同(说明重复) return firstPos === -1 || namesArr.lastIndexOf(target) !== firstPos; } console.log(checkNonSingle(names, value)) // false console.log(checkNonSingle(names, value2)) // true
方法3:用reduce统计出现次数(简洁直观)
通过reduce直接统计目标值的出现次数,再判断是否不等于1:
const value = 'a' const value2 = 'c' const arr = [{ name: 'a' }, { name: 'b' }] const checkNonSingle = (arr, target) => { const count = arr.reduce((total, item) => item.name === target ? total + 1 : total, 0); return count !== 1; } console.log(checkNonSingle(arr, value)) // false console.log(checkNonSingle(arr, value2)) // true
内容的提问来源于stack exchange,提问作者letters
相关产品推荐
相关产品推荐

