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
相关推荐
十一吖i11 分钟前
vue3表格显示隐藏列全屏拖动功能
前端·javascript·vue.js
徐同保2 小时前
tailwindcss暗色主题切换
开发语言·前端·javascript
生莫甲鲁浪戴2 小时前
Android Studio新手开发第二十七天
前端·javascript·android studio
细节控菜鸡4 小时前
【2025最新】ArcGIS for JS 实现随着时间变化而变化的热力图
开发语言·javascript·arcgis
拉不动的猪5 小时前
h5后台切换检测利用visibilitychange的缺点分析
前端·javascript·面试
桃子不吃李子5 小时前
nextTick的使用
前端·javascript·vue.js
Devil枫7 小时前
HarmonyOS鸿蒙应用:仓颉语言与JavaScript核心差异深度解析
开发语言·javascript·ecmascript
惺忪97987 小时前
回调函数的概念
开发语言·前端·javascript
前端 贾公子7 小时前
Element Plus组件v-loading在el-dialog组件上使用无效
前端·javascript·vue.js
天外飞雨道沧桑7 小时前
JS/CSS实现元素样式隔离
前端·javascript·css·人工智能·ai