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
相关推荐
爱编程的鱼1 分钟前
如何使用 HTML、CSS 和 JavaScript 随机更改图片颜色
javascript·css·html
前端小配角13 分钟前
直到将Promise的链式调用进行一步步拆解,我才终于发现了Promise设计的精妙之处...
javascript
Hilaku16 分钟前
为什么我放弃使用 Pinia?
前端·javascript·vue.js
陈_杨22 分钟前
鸿蒙5开发宝藏案例分享---在线短视频流畅切换
前端·javascript
前端小巷子31 分钟前
JS的 DOM 尺寸与位置属性
前端·javascript·面试
百锦再1 小时前
# Vue + OpenLayers 完整项目开发指南
开发语言·前端·javascript·vue.js·python·ecmascript·tkinter
Jinxiansen02111 小时前
Vue + Element Plus 实战:大文件切片上传 + 断点续传
前端·javascript·vue.js
MX_93591 小时前
JSON基础知识
开发语言·javascript·json
独立开阀者_FwtCoder1 小时前
11 个 JavaScript 杀手脚本,用于自动执行日常任务
前端·javascript·github
汪子熙1 小时前
深入理解 // eslint-disable-next-line no-eval 注释的作用与应用
前端·javascript·面试