JavaScript 中判断一个对象中是否存在相同的 `value`

判断对象是否存在相同值,可以直接使用lodash uniq,可以自己实现。例如,使用Object.valuesSet去重比较长度,或通过for...in循环记录值。若值为复杂类型,可用JSON.stringify转换后检查。还可用Mapreduce简化操作。递归方法适用于嵌套对象,而WeakMap可处理复杂引用类型。


方法 1:使用 Object.valuesSet

利用 Object.values 获取对象的所有值,然后通过 Set 去重,比较去重前后的长度。

代码实现

javascript 复制代码
function hasDuplicateValues(obj) {
  const values = Object.values(obj);
  const uniqueValues = new Set(values);
  return values.length !== uniqueValues.size;
}

// 示例
const obj = { a: 1, b: 2, c: 3, d: 2 };
console.log(hasDuplicateValues(obj)); // 输出 true(因为值 2 重复)

方法 2:使用 for...in 循环和对象记录

通过 for...in 循环遍历对象的属性值,并使用一个临时对象记录已经出现过的值。

代码实现

javascript 复制代码
function hasDuplicateValues(obj) {
  const seenValues = {};
  for (const key in obj) {
    const value = obj[key];
    if (seenValues[value]) {
      return true; // 发现重复值
    }
    seenValues[value] = true;
  }
  return false; // 没有重复值
}

// 示例
const obj = { a: 1, b: 2, c: 3, d: 2 };
console.log(hasDuplicateValues(obj)); // 输出 true

方法 3:使用 Array.prototype.someArray.prototype.filter

通过 Object.values 获取所有值,然后使用 somefilter 检查是否有重复值。

代码实现

javascript 复制代码
function hasDuplicateValues(obj) {
  const values = Object.values(obj);
  return values.some((value, index) => values.indexOf(value) !== index);
}

// 示例
const obj = { a: 1, b: 2, c: 3, d: 2 };
console.log(hasDuplicateValues(obj)); // 输出 true

方法 4:使用 reduceSet

通过 reduce 遍历对象的值,并使用 Set 检查是否有重复值。

代码实现

javascript 复制代码
function hasDuplicateValues(obj) {
  const values = Object.values(obj);
  const hasDuplicates = values.reduce((acc, value) => {
    if (acc.seen.has(value)) {
      acc.duplicate = true;
    }
    acc.seen.add(value);
    return acc;
  }, { seen: new Set(), duplicate: false });

  return hasDuplicates.duplicate;
}

// 示例
const obj = { a: 1, b: 2, c: 3, d: 2 };
console.log(hasDuplicateValues(obj)); // 输出 true

方法 5:处理特殊值(如 nullundefined

如果对象的值可能包含 nullundefined,需要额外处理,因为这些值无法作为对象的键。

代码实现

javascript 复制代码
function hasDuplicateValues(obj) {
  const seenValues = new Set();
  for (const key in obj) {
    const value = obj[key];
    if (seenValues.has(value)) {
      return true; // 发现重复值
    }
    seenValues.add(value);
  }
  return false; // 没有重复值
}

// 示例
const obj = { a: null, b: undefined, c: 1, d: null };
console.log(hasDuplicateValues(obj)); // 输出 true(因为 null 重复)

方法 6:处理嵌套对象或复杂值

如果对象的值是嵌套对象或复杂类型(如数组、对象等),可以使用 JSON.stringify 将值转换为字符串进行比较。

代码实现

javascript 复制代码
function hasDuplicateValues(obj) {
  const seenValues = new Set();
  for (const key in obj) {
    const value = JSON.stringify(obj[key]); // 将值转换为字符串
    if (seenValues.has(value)) {
      return true; // 发现重复值
    }
    seenValues.add(value);
  }
  return false; // 没有重复值
}

// 示例
const obj = { a: { x: 1 }, b: { x: 1 }, c: [1, 2], d: [1, 2] };
console.log(hasDuplicateValues(obj)); // 输出 true(因为 { x: 1 } 和 [1, 2] 重复)

方法 7:使用 Array.prototype.reduce 和对象记录

通过 reduce 遍历对象的值,并使用一个对象记录每个值的出现次数。

代码实现

javascript 复制代码
function hasDuplicateValues(obj) {
  const valueCounts = Object.values(obj).reduce((acc, value) => {
    acc[value] = (acc[value] || 0) + 1;
    return acc;
  }, {});

  return Object.values(valueCounts).some(count => count > 1);
}

// 示例
const obj = { a: 1, b: 2, c: 3, d: 2 };
console.log(hasDuplicateValues(obj)); // 输出 true

方法 8:使用 Map 记录值

使用 Map 来记录每个值的出现次数,Map 可以处理任何类型的值(包括 nullundefined)。

代码实现

javascript 复制代码
function hasDuplicateValues(obj) {
  const valueMap = new Map();
  for (const key in obj) {
    const value = obj[key];
    if (valueMap.has(value)) {
      return true; // 发现重复值
    }
    valueMap.set(value, true);
  }
  return false; // 没有重复值
}

// 示例
const obj = { a: 1, b: 2, c: 3, d: 2 };
console.log(hasDuplicateValues(obj)); // 输出 true

方法 9:使用 Array.prototype.everyArray.prototype.indexOf

通过 everyindexOf 检查是否有重复值。

代码实现

javascript 复制代码
function hasDuplicateValues(obj) {
  const values = Object.values(obj);
  return !values.every((value, index) => values.indexOf(value) === index);
}

// 示例
const obj = { a: 1, b: 2, c: 3, d: 2 };
console.log(hasDuplicateValues(obj)); // 输出 true

方法 10:使用 lodash

如果你已经在项目中使用了 lodash,可以直接使用 _.values_.uniq 来检查重复值。

代码实现

javascript 复制代码
const _ = require('lodash');

function hasDuplicateValues(obj) {
  const values = _.values(obj);
  return values.length !== _.uniq(values).length;
}

// 示例
const obj = { a: 1, b: 2, c: 3, d: 2 };
console.log(hasDuplicateValues(obj)); // 输出 true

方法 11:使用 Object.entriesSet

通过 Object.entries 获取键值对,然后提取值并使用 Set 去重。

代码实现

javascript 复制代码
function hasDuplicateValues(obj) {
  const values = Object.entries(obj).map(([key, value]) => value);
  const uniqueValues = new Set(values);
  return values.length !== uniqueValues.size;
}

// 示例
const obj = { a: 1, b: 2, c: 3, d: 2 };
console.log(hasDuplicateValues(obj)); // 输出 true

方法 12:使用递归处理嵌套对象

如果对象的值是嵌套对象,可以使用递归来检查重复值。

代码实现

javascript 复制代码
function hasDuplicateValues(obj, seenValues = new Set()) {
  for (const key in obj) {
    const value = obj[key];
    if (typeof value === 'object' && value !== null) {
      if (hasDuplicateValues(value, seenValues)) {
        return true;
      }
    } else if (seenValues.has(value)) {
      return true;
    } else {
      seenValues.add(value);
    }
  }
  return false;
}

// 示例
const obj = { a: 1, b: { c: 2 }, d: { e: 2 } };
console.log(hasDuplicateValues(obj)); // 输出 true(因为值 2 重复)

方法 13:使用 WeakMap 处理复杂对象

如果对象的值是复杂类型(如对象、数组等),可以使用 WeakMap 来记录值。

代码实现

javascript 复制代码
function hasDuplicateValues(obj) {
  const seenValues = new WeakMap();
  for (const key in obj) {
    const value = obj[key];
    if (typeof value === 'object' && value !== null) {
      if (seenValues.has(value)) {
        return true;
      }
      seenValues.set(value, true);
    }
  }
  return false;
}

// 示例
const obj = { a: { x: 1 }, b: { x: 1 }, c: { y: 2 } };
console.log(hasDuplicateValues(obj)); // 输出 false(因为对象是引用类型,即使内容相同也不重复)

方法 14:使用 JSON.stringifySet

如果对象的值是嵌套对象或复杂类型,可以使用 JSON.stringify 将值转换为字符串,然后使用 Set 检查重复。

代码实现

javascript 复制代码
function hasDuplicateValues(obj) {
  const seenValues = new Set();
  for (const key in obj) {
    const value = JSON.stringify(obj[key]);
    if (seenValues.has(value)) {
      return true;
    }
    seenValues.add(value);
  }
  return false;
}

// 示例
const obj = { a: { x: 1 }, b: { x: 1 }, c: [1, 2], d: [1, 2] };
console.log(hasDuplicateValues(obj)); // 输出 true(因为 { x: 1 } 和 [1, 2] 重复)

总结

  • 如果对象的值是简单类型,推荐使用 方法 1方法 2方法 8
  • 如果对象的值是嵌套对象或复杂类型,推荐使用 方法 12方法 14
相关推荐
独立开阀者_FwtCoder1 分钟前
前端自适应方案全面解析:打造多端适配的现代网页
前端·javascript·面试
渣渣宇a12 分钟前
Three_3D_Map 中国多个省份的组合边界绘制,填充背景
前端·javascript·three.js
狗子的狗粮17 分钟前
Node.js 模块加载与 exports 和 module.exports 的区别
javascript
zayyo17 分钟前
Web 应用轻量化实战
前端·javascript·面试
kovli21 分钟前
红宝书第十七讲:通俗详解JavaScript的Promise与链式调用
前端·javascript
李是啥也不会27 分钟前
Vue中Axios实战指南:高效网络请求的艺术
前端·javascript·vue.js
贾公子38 分钟前
MySQL数据库基础 === 约束
前端·javascript
贾公子1 小时前
element ui & plus 版本 日期时间选择器的差异
前端·javascript
贾公子1 小时前
form组件的封装(element ui ) 简单版本
前端·javascript
贾公子1 小时前
下拉框组件的封装(element ui )
前端·javascript