根据每个对象的值完全相同-去重
要实现一个功能,在一个对象数组中根据每个对象的值完全相同来进行去重,我们可以使用 JavaScript 来完成这个任务。下面是一个完整的示例代码,它展示了如何实现这一功能。
假设我们有一个对象数组 arr,每个对象包含多个属性(例如 Bu, Name, Age 等),我们要根据这些对象的所有值是否完全相同来去除重复的对象。
示例代码-1
// 假设这是你的初始数据
const arr = [
{ Bu: 'A', Name: 'Alice', Age: 25 },
{ Bu: 'B', Name: 'Bob', Age: 30 },
{ Bu: 'A', Name: 'Alice', Age: 25 }, // 重复项
{ Bu: 'C', Name: 'Charlie', Age: 35 },
{ Bu: 'D', Name: 'David', Age: 40 },
{ Bu: 'A', Name: 'Alice', Age: 25 } // 又一个重复项
];
// 使用 Map 来存储对象的 JSON 字符串形式作为键,对应的值为出现次数
const map = new Map();
// 遍历数组,将每个对象转换为 JSON 字符串并检查是否已存在
const uniqueArr = arr.filter(item => {
const jsonString = JSON.stringify(item);
if (map.has(jsonString)) {
// 如果已经存在,则增加计数
map.set(jsonString, map.get(jsonString) + 1);
return false; // 不添加重复项到新数组
} else {
// 如果不存在,则添加到 Map 中,并加入新数组
map.set(jsonString, 1);
return true;
}
});
console.log(uniqueArr);
// 输出结果
// [
// { "Bu": "A", "Name": "Alice", "Age": 25 },
// { "Bu": "B", "Name": "Bob", "Age": 30 },
// { "Bu": "C", "Name": "Charlie", "Age": 35 },
// { "Bu": "D", "Name": "David", "Age": 40 }
// ]
解释
- 初始化:首先定义了一个对象数组 arr。
- 创建 Map:使用 Map 来存储每个对象的 JSON 字符串形式作为键,对应的值表示该对象在数组中出现的次数。
- 过滤重复项:通过 filter 方法遍历数组中的每个元素,将其转换为 JSON 字符串,并检查此字符串是否已经在 Map 中。如果存在,则不将其添加到新数组 uniqueArr 中;如果不存在,则添加到 Map 和新数组中。
- 输出结果:最后打印出没有重复项的新数组 uniqueArr。
这种方法确保了只有当对象的所有属性值完全相同时才会被视为重复。
根据对象中的指定的多个属性值-去重
在处理对象数组时,如果需要根据对象中的多个属性值进行去重,可以使用 JavaScript 中的 Map 对象或者 Set 对象结合字符串化的方法来实现。下面我将给出一个具体的例子,假设我们有一个对象数组,每个对象中有两个属性 name 和 age,我们需要根据这两个属性的值来进行去重。
示例代码-2
// 假设这是我们的原始数据
const users = [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 30 },
{ name: 'Alice', age: 25 },
{ name: 'Charlie', age: 25 },
{ name: 'Alice', age: 25 },
{ name: 'David', age: 30 }
];
// 定义一个函数,根据给定的 key 数组来去重
function uniqueByKeys(array, keys) {
const seen = new Map();
return array.filter(item => {
// 生成一个唯一的标识符(基于提供的 key)
const identifier = keys.map(key => item[key]).join('|');
if (seen.has(identifier)) {
// 如果已经存在,则不加入结果数组
return false;
} else {
// 否则,添加到已见标识符 map 中,并加入结果数组
seen.set(identifier, true);
return true;
}
});
}
// 使用函数去重
const uniqueUsers = uniqueByKeys(users, ['name', 'age']);
// 输出去重后的结果
console.log(uniqueUsers);
解释
-
定义 uniqueByKeys 函数:这个函数接受一个数组和一个键的数组作为参数。
-
创建一个 Map 对象 seen:用来存储已经见过的标识符。
-
过滤数组:遍历输入的数组,对于每个元素,根据指定的键生成一个唯一的标识符(这里使用 join(‘|’) 来连接各个键对应的值)。
-
检查标识符是否已经存在于 Map 中:
4.1 如果存在,则跳过当前元素;
4.2 如果不存在,则将标识符添加到 Map 中,并将当前元素保留在过滤后的数组中。
通过这种方式,我们可以有效地去除那些具有相同 name 和 age 属性组合的对象。这种方法不仅适用于本例中的两个属性,还可以轻松扩展到更多属性的情况,只需要修改 keys 参数即可。