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
相关推荐
Cobyte23 分钟前
4.响应式系统基础:从发布订阅模式的角度理解 Vue3 的数据响应式原理
前端·javascript·vue.js
晓得迷路了26 分钟前
栗子前端技术周刊第 124 期 - ESLint v10.2.0、React Native 0.85、Node.js 25.9.0...
前端·javascript·eslint
星空椰34 分钟前
JavaScript基础:运算符和流程控制
开发语言·javascript·ecmascript
窝子面1 小时前
NestJs+MongoDB+Deepseek+Langchain实现ai聊天助手
javascript·数据库·人工智能·mongodb
吴声子夜歌1 小时前
ES6——Calss详解
javascript·es6·原型模式
❆VE❆1 小时前
虚拟列表原理与实战运用场景详解
前端·javascript·css·vue.js·html·虚拟列表
灵感__idea9 小时前
Hello 算法:贪心的世界
前端·javascript·算法
killerbasd12 小时前
牧苏苏传 我不装了 4/7
前端·javascript·vue.js
橘子编程13 小时前
JavaScript与TypeScript终极指南
javascript·ubuntu·typescript
叫我一声阿雷吧13 小时前
JS 入门通关手册(45):浏览器渲染原理与重绘重排(性能优化核心,面试必考
javascript·前端面试·前端性能优化·浏览器渲染·浏览器渲染原理,重排重绘·reflow·repaint