对象数组去重,

项目中使用map结合filter做一个对象数组去重

        unique: function(arr, type) {
            const res = new Map();
            //has查找第一个值,没找到了就set加这条数据,满足这两个条件就过滤出来。如果有重复的话has就过不去
            return arr.filter((a) => !res.has(a[type]) && res.set(a[type], 1));
        },
//data为传的数组,name是根据那个字段来去重
unique(data, "name");
### 对象数组实现方法 在编程中,对象数组操作可以通过多种方式实现。以下是几种常见的解决方案及其代码示例。 #### 1. 使用 `Set` 和自定义比较逻辑 由于 `Set` 无法直接对对象数组进行(因为对象是引用类型),需要通过 JSON 字符串化或其他方式来实现自定义比较逻辑。 ```javascript const arr = [ { id: 1, name: "Alice" }, { id: 2, name: "Bob" }, { id: 1, name: "Alice" } ]; const uniqueArr = Array.from( new Set(arr.map(item => JSON.stringify(item))) ).map(item => JSON.parse(item)); console.log(uniqueArr); // 输出: [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ] ``` 这种方法通过将对象转换为字符串来实现唯一性判断[^5]。 #### 2. 使用 `filter` 和 `findIndex` 通过 `filter` 方法结合 `findIndex`,可以筛选出唯一的对象。 ```javascript const arr = [ { id: 1, name: "Alice" }, { id: 2, name: "Bob" }, { id: 1, name: "Alice" } ]; const uniqueArr = arr.filter((item, index) => arr.findIndex(obj => obj.id === item.id) === index ); console.log(uniqueArr); // 输出: [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ] ``` 这种方法利用了 `findIndex` 的首次匹配特性,确保每个对象只保留第一次出现的实例[^4]。 #### 3. 使用 Map 或 WeakMap 通过 `Map` 或 `WeakMap` 存储已处理的对象键值,可以高效地实现。 ```javascript const arr = [ { id: 1, name: "Alice" }, { id: 2, name: "Bob" }, { id: 1, name: "Alice" } ]; const map = new Map(); const uniqueArr = arr.filter(item => { if (map.has(item.id)) return false; map.set(item.id, true); return true; }); console.log(uniqueArr); // 输出: [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ] ``` 此方法通过 `Map` 的键值存储特性,避免了对象的加入[^5]。 #### 4. Java 中的对象数组 在 Java 中,可以通过集合类如 `HashSet` 来实现对象数组。首先需要确保对象实现了 `equals` 和 `hashCode` 方法。 ```java import java.util.*; class Person { int id; String name; Person(int id, String name) { this.id = id; this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return id == person.id && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(id, name); } @Override public String toString() { return "Person{id=" + id + ", name='" + name + "'}"; } } public class Main { public static void main(String[] args) { Person[] people = { new Person(1, "Alice"), new Person(2, "Bob"), new Person(1, "Alice") }; Set<Person> set = new HashSet<>(Arrays.asList(people)); Person[] uniqueArray = set.toArray(new Person[0]); System.out.println(Arrays.toString(uniqueArray)); // 输出: [Person{id=1, name='Alice'}, Person{id=2, name='Bob'}] } } ``` 这段代码展示了如何通过 `HashSet` 对象数组,并依赖 `equals` 和 `hashCode` 方法确保唯一性[^1]。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值