js扩展方法(数组不重复推入)

扩展方法是一个很有趣的东西。

使用prototype在原始的类型上添加自己需要的方法。方便在一些常用的情况下使用,比如说字符串的String.trim()清除字符串前后的空格(当然这个方法内置已经有了)

举个数组的例子。

Array.push()  -- 推入一个数据。

假如我希望推入的数据不重复呢。要么在调用的时候进行数据遍历是否重复再推入,但这样略显麻烦以及重复。

 1 Array.prototype.pushWithoutDuplicate = function () {
 2   for (let i = 0; i < arguments.length; i++) {
 3     const arg = arguments[i]
 4     // this表示调用的数组
 5     if (this.indexOf(arg) === -1) {
 6       this.push(arg)
 7     }
 8   }
 9 }
10 
11 // 这样的话
12 let a = [1, 2, 3]
13 a.pushWithoutDuplicate(4)   //成功 a = [1, 2, 3, 4]
14 a.pushWithoutDuplicate(3)  // 无反应

这样好像感觉有点蠢,毕竟我肯定知道3是重复的。

但实际情况,比如我开发一个随机抽奖,但实际上,奖项可能不能被同一个人拿到(踩狗屎运那种),所以这种情况往往很有用

 1 const peoples = ['老王', '小白', '凑热闹的']
 2 const prizeNum = 2
 3 let prizeResult = []
 4 
 5 function randomResult () {
 6   // 当获奖者小于2
 7   while (prizeResult.length < prizeNum) {
 8     // 随机产生一个获奖者
 9     prizeResult.push(peoples[Math.floor(Math.random() * 2)])
10     // 收不定老王很幸运,全包了,那怎办
11   }
12 }
13 
14 
15 // 这种情况就不会发生了
16 function randomResultTwo () {
17   // 当获奖者小于2
18   while (prizeResult.length < prizeNum) {
19     // 随机产生一个获奖者
20     prizeResult.pushWithoutDuplicate(peoples[Math.floor(Math.random() * 2)])
21   }
22 }

ES6中Set的数据结构,也可以达到上述的效果。

Set类似于数据,但是成员的值都是唯一的。

1 const s = new Set();
2 
3 [2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
4 
5 for (let i of s) {
6   console.log(i);
7 }
8 // 2 3 5 4

或者直接

array = [...new Set(array)]
// 一步到位
以梦为马
原文地址:https://www.cnblogs.com/lsAxy/p/12753410.html