泰安建设局网站,天津搜索引擎优化,网站的主题,公司推广是做什么的现在有这么一个重复数组#xff1a;const arr [a,a,b,a,b,c]只推荐简单高效的方法#xff0c;复杂繁琐的方法不做推荐方法一#xff1a;const res [...new Set(arr)]Set类型是什么呢#xff1f;Set 是ES6新增的一种新集合类型。具体知识点可以看下面附录#xff1a;根据…现在有这么一个重复数组const arr [a,a,b,a,b,c]只推荐简单高效的方法复杂繁琐的方法不做推荐方法一const res [...new Set(arr)]Set类型是什么呢Set 是ES6新增的一种新集合类型。具体知识点可以看下面附录根据上面的知识点我们可以得到console.log(...new Set(arr)) // a b c所以去重也可以这么实现const res Array.from(new Set(arr)) // Array.from将类数组转换成数组
// or
const res Array.of(...new Set(arr)) // Array.of根据传入的参数生成数组方法二var arr [apple,apps,pear,apple,orange,apps];
var newArr arr.filter(function(item,index){return arr.indexOf(item) index; // 因为indexOf 只能查找到第一个
});方法三some 循环去重function distinct(list) {let result [list[0]];// 用于承接没有重复的数据初始时将原始数组的第一个值赋给它。for (let i 1; i list.length; i) {// 判断结果数组中是否存在一样的值若果没有的话则将数据存入结果数组中。if (!(result.some(val list[i] val))) {result.push(list[i]);}}return result;}方法四如果不能用ES6、5的语法。需要原生方法双重for循环去重function noRepeat(arr) {for(var i 0; i arr.length-1; i){for(var j i1; j arr.length; j){if(arr[i]arr[j]){arr.splice(j,1);j--;}}}return arr;}方法五简单数组用includes去重function noRepeat(arr) {let newArr [];for(i0; iarr.length; i){if(!newArr.includes(arr[i])){newArr.push(arr[i])}}return newArr
}附录 -Set使用 new 关键字和 Set 构造函数可以创建一个空集合const s new Set();如果想在创建的同时初始化实例则可以给 Set 构造函数传入一个可迭代对象Array Map Set WeakMap WeakSet。可迭代对象需要包含插入到新集合实例中的元素(Set 可以包含任何 JavaScript 数据类型作为值)。Set构造函数会迭代传入参数去重后保存到集合实例中。特点Set 是唯一值的集合。每个值在 Set 中只能出现一次。一个 Set 可以容纳任何数据类型的任何值。你可以把Set想像成跟数组一样我们用size来输出Set集合的长度。const s new Set([a,b,c,c]);
s.size; // 3 去重了一个c
const s2 new Set();
s2.add(a)
s2.add(b)
s2.add(c)
s2.size // 3与Array的区别最根本的区别是数组是一个索引集合这说明数组中的数据值按索引排序。相比之下set是一个键的集合。set不使用索引而是使用键对数据排序看下面forEach。set 中的元素按插入顺序是可迭代的它不能包含任何重复的数据。对比Array的优势在运行时间方面上Set占了很大的优势查看元素使用indexOf()或includes()检查数组中的项是否存在是比较慢的。删除元素:在Set中可以根据每项的的 value 来删除该项。在数组中等价的方法是使用基于元素的索引的splice()。与前一点一样依赖于索引的速度很慢。保存 NaN不能使用indexOf()或 includes() 来查找值 NaN而 Set 可以保存此值。删除重复项:Set对象只存储惟一的值,如果不想有重复项存在相对于数组的一个显著优势因为数组需要额外的代码来处理重复。时间复杂度数组用来搜索元素的方法时间复杂度为0(N)。换句话说运行时间的增长速度与数据大小的增长速度相同。相比之下Set用于搜索、删除和插入元素的方法的时间复杂度都只有O(1)这意味着数据的大小实际上与这些方法的运行时间无关。具体解释与面试题强烈推荐阅读如何使用 Set 来提高JS代码的性能 - 知乎 (zhihu.com)其他APIhas()查询Set实例是否存在某元素(返回布尔值)const s new Set();
s.add(1).add(2).add(3);
s.has(1); // truedelete() 删除某个元素s.delete(1);clear()清空Set实例s.clear();
Array.from(s); // []迭代for offor in不输出因为它不是以下标为索引的集合const s new Set([a,b,c,c]);
for (var n of s) {console.log(n)}
// a
// b
// cforEachs.forEach((t,i)console.log(t,i))
// a a
// b b
// c c
// 输出了键值对的结构原生属性可以看见Set实例的三个属性返回了枚举的类数组。直接用Array.form转换Array.from(s.keys())
// [a, b, c]
Array.from(s.entries())
// [[a, a],[b, b],[c, c]]
Array.from(s.values())
// [a, b, c]附录-面试题题目给定一个整数无序数组和变量 sum如果存在数组中任意两项和使等于 sum 的值则返回true。否则,返回false。例如数组[3,5,1,4]和 sum 9函数应该返回true因为4 5 9。解题思路本题其实是为了找数组元素与sum的差值是否在数组里重复出现。const s new Set()
arr.some(t {if (s.has(t)) {return true}s.add(sum-t);return fasle
})简洁点写const findSum (arr, sum) arr.some((set n set.has(n) || !set.add(sum - n))(new Set));