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

如何实现按指定字段对数组对象去重并校验参数合法性?

解决数组对象按指定字段去重的参数校验问题

你需要实现数组对象按指定字段去重的功能,同时满足三个需求,但当前代码在传入不存在的字段时无法返回预期的错误提示,以下是问题分析和修复方案:

原代码的问题

  1. 参数判断逻辑混乱:使用...props剩余参数时,props本身就是数组,原代码中else if (props instanceof Array===true)的条件永远成立,导致正常传入字段名时也会触发错误返回,与需求矛盾。
  2. 缺少字段存在性校验:原代码未检查传入字段是否存在于数组的对象元素中,传入不存在的字段时无法触发错误提示。
  3. 核心去重逻辑缺失:原代码的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:25:16