对于一个特定的只包含string
或number
的数组,可以通过set
和array
的转换将数组中的重复元素剔除,如:
let arr = [1, 1, 2, 3, 3]
arr = Array.from(new Set(arr))
// console.log(arr): [1,2,3]
但是对于对象数组,就不能这么操作,如:
let arr = [{a: 1, b: 2}, {a: 1, b: 2}, {a: 1, b: 3}]
arr = Array.from(new Set(arr))
// console.log(arr): [{"a":1,"b":2},{"a":1,"b":2},{"a":1,"b":3}]
对于这种情况,可以先对arr
进行处理:
arr = arr.map(item=>JSON.stringify(item))
接着进行set
和array
的转换,注意最终结果要反处理:
arr = Array.from(new Set(arr)).map(item=>JSON.parse(item))
// console.log(arr): [{"a":1,"b":2},{"a":1,"b":3}]
总结:对于一般的string
或number
的数组,可以直接使用Array.from(new Set(arr))
的方式直接操作,但是对于对象数组,需要先对对象进行处理。
1、一般的string
或number
的数组
let arr = [1, 1, 2, 3, 3]
arr = Array.from(new Set(arr))
// console.log(arr): [1,2,3]
2、对象数组
let arr = [{a: 1, b: 2}, {a: 1, b: 2}, {a: 1, b: 3}]
arr = Array.from(new Set(arr.map(item=>JSON.stringify(item)))).map(item=>JSON.parse(item))
// console.log(arr): [{"a":1,"b":2},{"a":1,"b":3}]
注意,对象内数据的顺序不同也会被认为是不同的对象,因此可以按需要先取keys排序,另外更具原有对象构造一个新的对象后再进行判断