基于ES6实现uniqBy函数,寻求更简洁的代码实现方案
更简洁的
uniqBy实现方案 嘿,我来分享几个更简洁且高效的uniqBy实现方式,既能减少代码行数,还能保持不错的可读性和性能~
方案一:结合filter与Map(推荐)
这个方案用filter直接生成结果数组,搭配Map快速判断元素是否已存在,代码简洁且性能和你原实现相当:
const uniqBy = (arr, fn) => { const map = new Map(); return arr.filter(item => { const key = typeof fn === 'function' ? fn(item) : item[fn]; return !map.has(key) && map.set(key, true); }); };
为什么这么写?
filter会自动帮我们筛选符合条件的元素,省去手动维护res数组的步骤Map的has和set操作都是O(1)时间复杂度,和你原代码里的Set一样高效- 逻辑清晰,一眼就能看明白是在做去重判断
方案二:极致一行写法(可读性稍弱)
如果追求极致的代码长度,可以把逻辑压缩成一行,不过可读性会打折扣,适合对代码简洁度要求极高的场景:
const uniqBy = (arr, fn) => arr.filter((m => item => !m.has(typeof fn === 'function' ? fn(item) : item[fn]) && m.set(typeof fn === 'function' ? fn(item) : item[fn], true))(new Map()));
验证效果
用你给出的测试用例验证,结果和原代码完全一致:
console.log(uniqBy([2.1, 1.2, 2.3], Math.floor)); // [2.1, 1.2] console.log(uniqBy([{x:1}, {x:2}, {x:1}], 'x')); // [{x:1}, {x:2}]
内容的提问来源于stack exchange,提问作者Vic
相关产品推荐
相关产品推荐

