js去重方法

这六种JavaScript数组去重方法是:
1 .双层循环,效率低,内存占用大。
2 .直接操作原数组效率低,消耗大量内存。
3 . 使用对象属性删除重复项。
这是有效的,但可能不直观。
4 .数组递归去重。
代码更复杂,但效率更高。
5 .indexOf和forEach代码简单,但效率一般。
6 . ES6 集合简单高效,但必须考虑兼容性。

简单来说,如果您追求简单和高效,请选择 ES6 套件。
如果兼容性不是问题,请使用此选项。
除非有特殊情况,一般不建议采用其他方法。
由您决定哪一个最适合您的项目。

js中数组去重的方法 js数组去重的5种方法

哈,说到JS数组去重,这种情况并不少见。
在我访问问答论坛的十年里,我看到很多人问这个问题。
先说第一种方法,就是双循环加夹杂。
这很简单。
比如说,我之前认识了一个朋友。
他列了一个产品清单,想去掉重复的,所以就用了这个方法。
我当时为它编写的代码是:
javascript 让 arr = [1 , 2 , 2 , 3 , 4 , 4 , 5 ]; 让结果=[]; for (让 i = 0; i 第二种方法是ES6 Set。
这东西用起来还是挺高级的。
我当时不太明白,后来查资料才知道。
例如,Buddy正在做用户管理,用户ID可能有重复,所以他使用Set来去除重复。
代码是:
javascript。
让 arr = [1 , 2 , 2 , 3 , 4 , 4 , 5 ]; 让结果 = [...new Set(arr)]; 控制台.log(结果); // 输出 [1 , 2 , 3 , 4 , 5 ]
第三种方法是使用数组的LastIndexOf。
这个东西比较适合不需要维持原来顺序的场景。
比如有朋友在处理订单号的时候就用过这个方法。
代码是:
javascript。
让 arr = [1 , 2 , 2 , 3 , 4 , 4 , 5 ]; 让结果=[]; for (让 i = 0; i 第四种方法是使用 JSON.stringify 对数组中包含的对象进行重复数据删除。
这个东西比较适合对象数组去重。
例如,我正在帮助朋友删除重复的用户信息。
用户信息是用对象来表示的,所以我使用了这个方法。
代码是:
javascript。
let arr = [{id: 1 , name: "Tom"}, {id: 2 , name: "Jerry"}, {id: 1 , name: "Tom"}]; 让结果=[]; 让他们看到 = new Set(); for (让 i = 0; i 最后一种方法是在对数组进行排序后比较相邻元素。
这个东西比较适合需要保留数组原始顺序的场景。
比如有朋友用过处理库存数据时使用此方法。
代码是:
javascript。
让 arr = [1 , 2 , 2 , 3 , 4 , 4 , 5 ]; arr.sort((a, b) => a
b); 让结果 = [arr[0]]; for (让 i = 1 ; i 1 ]) { 结果.push(arr[i]); } } 控制台.log(结果); // 输出 [1 , 2 , 3 , 4 , 5 ]
总之,这五种方法各有其适用范围,应根据实际情况进行选择。
说实话,之前我无法理解哪个更好,但后来我逐渐明白了。

js中数组去重的方法

嘿,你问我JS数组缩减是吧?好吧,根据我从陷阱中学到的东西,我会给你一个清单。

上周,一位客户问我为什么他使用 Set,但仍然收到错误,说数组中有重复的项目...我后来发现他错误地使用了 Set。
对象还原不能由女性直接完成,所以我不得不改变主意。

这里只有这些方法:
1 .这个设定非常霸气、简单、原始。
例如,const arr = [1 ,2 ,2 ,3 ]; const 异常 = [... new Set(arr)];已完成此操作[1 ,2 ,3 ]。
为什么说风骚呢?它非常高效,只需一行即可写入,时间复杂度接近 O(n)。
但!请注意,它仅适用于基本类型(数字、字符串)。
如果要复制对象 {id: 1 },Set 会感到困惑,因为它查看内存地址,不同的地址被认为是不同的。
去年我在项目中被这个陷阱绊倒,差点休克而死。
2 .filter + indexOf 这个兼容性很好,可以和ES5 一起使用,尤其是老项目。
代码为 arr.filter((item, index) => arr.indexOf(item) === index);但性能较差,时间复杂度为O(n²)。
如果你的数组特别大,比如几万条数据,它会自动冻结。
我有一个带有用户列表的项目。
我用这个方法来删除重复项。
测试机器花了十多分钟才完成,在我更改设置后只花了几秒钟。
3 . 对于Each + Splice,不太推荐这样做,但确实有人使用它。
使用 splice 来破坏数组并删除重复项。
代码看起来不错 arr.forEach((item, index) => { if (arr.indexOf(item) !== index) arr.splice(index, 1 ); });但问题实在是太多了!它会自动修改主数组,并且您在下一个代码中可能不会发现很多错误。
此外,时间复杂度也是O(n²),并且可能会丢失元素。
例如,如果删除第一个,则将跳过下一个。
我建议您远离这种方法。
4 .Reduce 适合需要链式运算或者逻辑比较复杂的情况。
arr.reduce((acc, item) => !acc.include(item)? [... acc, item]: acc, []);看起来不错,但请注意,包含是 O(n),所以它仍然是 O(n²)。
但幸运的是,它并没有改变主要交易,而且逻辑也很清晰。

总结我的想法:

如果数组很小,一切皆有可能。
Set很方便,而Filter写起来比较短。
例如arr = [1 , 2 , 3 ]可以直接设置或过滤。

数组很大,性能很重要,所以应该使用Set。
别告诉我filter+indexOf,那是自找麻烦。

如果不想改变原来的数组,setup和shrink是不错的选择。
你不需要使用 Each+Splice,创建 bug 更容易。

减少东西? Set不起作用,必须使用Map,或者使用Set将对象转换为字符串(但要注意循环引用可能会导致问题)。
例如, const unique = [... new Map(objArr.map(o => [JSON.stringify(o) o])) values()];这可行,但写起来更复杂。

反正你能理解。
我仍在研究如何处理 MapReduce 边界条件。