要去重的数组,要求根据name字段去重
let objArray = [{name: 1}, {name: 2}, {name: 3}, {name: 2}, {name: 1}]
最开始在网上找到的答案我是这样写的:
/**
* 对象数组去重
* objArray 对象数组
* key 去重字段
*/
export default function arrayDe (objArray, key) {
const hash = {}
const newObjArray = objArray.reduce((item, next) => {
hash[next[key]] ? '' : hash[next[key]] = true && item.push(next)
return item
}, [])
return newObjArray
}
后来根据同事的提示,参考链接:https://segmentfault.com/q/1010000014361732/a-1020000014362688
改成了下面:
/**
* 对象数组去重
* objArray 对象数组
* key 去重字段
*/
export default function arrayDe (objArray, key) {
const hash = new Map()
return objArray.filter(arr => !hash.has(arr[key]) && hash.set(arr[key], 1))
}
感觉是简洁了一点,但是还有更优雅的:
/**
* 对象数组去重
* objArray 对象数组
* key 去重字段
*/
export default function arrayDe (objArray, key) {
return objArray.filter((el, index, arr) => index === arr.findIndex(_el => _el[key] === el[key]))
}
完美!!!!