判断数组对象中是否某个字段的值有重复
场景:常在前端添加多行或修改某行数据时。对整个数组对象中用于判断某个字段,标题或者编码等字段是否重复,如下图简单示意:
要判断一个数组中对象的某个字段是否有重复值,可以使用类似的方法,但需要调整逻辑以检查对象中特定字段的值。以下是一些常用的方法:
方法 1:使用 Set
function hasDuplicateField(array, field) {const uniqueValues = new Set();for (const obj of array) {if (uniqueValues.has(obj[field])) {return true;}uniqueValues.add(obj[field]);}return false;
}const array = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 3, name: 'Alice' }
];console.log(hasDuplicateField(array, 'name')); // 输出: true
console.log(hasDuplicateField(array, 'id')); // 输出: false
方法 2:使用 some 方法
function hasDuplicateField(array, field) {return array.some((obj, index) => {const value = obj[field];return array.some((innerObj, innerIndex) => innerIndex !== index && innerObj[field] === value);});
}const array = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 3, name: 'Alice' }
];console.log(hasDuplicateField(array, 'name')); // 输出: true
console.log(hasDuplicateField(array, 'id')); // 输出: false```方法 3:使用对象或 Map```cpp
function hasDuplicateField(array, field) {const seen = {};for (const obj of array) {const value = obj[field];if (seen[value]) {return true;}seen[value] = true;}return false;
}const array = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 3, name: 'Alice' }
];console.log(hasDuplicateField(array, 'name')); // 输出: true
console.log(hasDuplicateField(array, 'id')); // 输出: false
方法 4:使用 filter 方法`在这里插入代码片
function hasDuplicateField(array, field) {const uniqueValues = array.map(obj => obj[field]);const uniqueArray = uniqueValues.filter((value, index) => uniqueValues.indexOf(value) === index);return uniqueArray.length !== uniqueValues.length;
}const array = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 3, name: 'Alice' }
];console.log(hasDuplicateField(array, 'name')); // 输出: true
console.log(hasDuplicateField(array, 'id')); // 输出: false
总结
Set 方法:通常性能最佳,适合大多数情况。
some 方法:代码简洁,但性能不如 Set 方法。
对象或 Map 方法:适合需要额外记录或处理重复元素的场景。
filter 方法:代码可读性高,但性能较差,适合小规模数据。
选择方法时,可以根据数据的规模和性能要求来决定。对于大型数组,使用 Set 通常是最佳选择。