如何实现按指定字段对数组对象去重并校验参数合法性?
解决数组对象按指定字段去重的参数校验问题
你需要实现数组对象按指定字段去重的功能,同时满足三个需求,但当前代码在传入不存在的字段时无法返回预期的错误提示,以下是问题分析和修复方案:
原代码的问题
- 参数判断逻辑混乱:使用
...props剩余参数时,props本身就是数组,原代码中else if (props instanceof Array===true)的条件永远成立,导致正常传入字段名时也会触发错误返回,与需求矛盾。 - 缺少字段存在性校验:原代码未检查传入字段是否存在于数组的对象元素中,传入不存在的字段时无法触发错误提示。
- 核心去重逻辑缺失:原代码的else分支仅包含日志输出,未实现按字段去重的功能,之前的测试结果属于巧合。
修复后的代码
Array.prototype.uniqueArray = function (field) { // 需求1:空数组直接返回原数组的拷贝 if (this.length === 0) { return [...this]; } // 校验参数:必须传入单个字符串类型的字段名 if (typeof field !== 'string') { return 'Invalid Parameter Type'; } // 校验字段是否存在于所有数组对象元素中 const hasValidField = this.every(item => typeof item === 'object' && item !== null && field in item ); if (!hasValidField) { return 'Invalid Parameter Type'; } // 实现按指定字段去重 const seenValues = new Set(); return this.filter(item => { const fieldValue = item[field]; if (!seenValues.has(fieldValue)) { seenValues.add(fieldValue); return true; } return false; }); }; // 测试用例 console.log([ ].uniqueArray('name')); // 输出:[] console.log([ {id: 1, name: "Jony"}, {id: 2, name: "Jony"}, {id: 3, name: "Kane"}].uniqueArray('name')); // 输出:[ { id: 1, name: 'Jony' }, { id: 3, name: 'Kane' } ] console.log([ {id: 1, name: "Jony"}, {id: 2, name: "Jony"}, {id: 3, name: "Kane"}].uniqueArray('test')); // 输出:'Invalid Parameter Type'
代码关键点说明
- 空数组处理:直接判断数组长度为0时返回拷贝,满足需求1。
- 参数类型校验:确保传入的是字符串类型的字段名,不符合则返回错误提示。
- 字段存在性校验:使用
every方法检查所有数组对象都包含指定字段,只要有一个对象不包含就返回错误,满足需求3。 - 去重逻辑:利用
Set记录已出现的字段值,通过filter保留第一次出现的对象,实现按字段去重,满足需求2。
内容的提问来源于stack exchange,提问作者Madush Nim
相关产品推荐
相关产品推荐

