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

使用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)]
// 一步到位

js扩展方法(数组不重复推入)的更多相关文章

  1. JS扩展方法——字符串trim()

    转自:http://www.cnblogs.com/kissdodog/p/3386480.html <head> <title>测试JS扩展方法</title> ...

  2. JS扩展方法

    JS扩展方法与C#的扩展方法非常相似,也是可以链式调用的,也是通过对某个类的扩展写法来实现.这个东西非常好用,如果将预先写好的方法放到一个js里面引用的话,那么后面写js将非常有趣. 下面给出一个例子 ...

  3. JS 扩展方法prototype

    通过类对象的prototype设置扩展方法,下面为String对象增加quote(两边加字符)方法 <script type="text/javascript"> St ...

  4. Js中去除数组中重复元素的6种方法

    方法一: Array.prototype.method1 = function(){ var arr=[]; //定义一个临时数组 for(var i = 0; i < this.length; ...

  5. JS 清除字符串数组中,重复元素

    <script language="JavaScript"> <!-- var arrData=new Array(); for(var i=0; i<10 ...

  6. Js扩展方法ReplaceAll

    String.prototype.replaceAll = function (reallyDo, replaceWith, ignoreCase) { if (!RegExp.prototype.i ...

  7. 添加一个js扩展方法

    String.prototype.repeatify=String.prototype.repeatify || function(times){ var str=''; for(var i=0;i& ...

  8. Array js扩展方法 forEach()

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. js一些方法的扩展

    //JS扩展方法与C#的扩展方法非常相似,也是可以链式调用的,也是通过对某个类的扩展写法来实现.这个东西非常好用,如果将预先写好的方法放到一个js里面引用的话,那么后面写js将非常有趣. //下面给出 ...

随机推荐

  1. Spring学习(八)AOP详解

    文章更新时间:2020/04/06 一.一个例子 在上面的例子中,包租婆的核心业务就是签合同,收房租,那么这就够了,灰色框起来的部分都是重复且边缘的事,交给中介商就好了,这就是 AOP 的一个思想:让 ...

  2. 有关Kafka的那些事

    Kafka基本概念 Producer: 消息和数据的生产者,向kafka的一个topic发布消息的进程.代码.服务. Consumer:消息和数据的消费者,订阅数据并且处理器发布的消息的进程.代码.服 ...

  3. Linux基本命令学习

    对操作系统进行信息查询 硬盘大小 查看磁盘信息:  fdisk -l/dev/sda       操作系统中第一块硬盘的名称以及所在路径linux操作系统中一切皆文件(文件名)        sd(硬 ...

  4. chrome浏览器的两个坑,以及其他

    chrome打开本地网页时,不能保存cookiechrome拒绝使用ajax访问本地文件(火狐可以) ipinfo.io/ip 获得公网iphttps://v1.hitokoto.cn/ 获得一句动漫 ...

  5. 最全总结 | 聊聊 Python 数据处理全家桶(配置篇)

    1.前言 在实际项目中,经常会接触到各种各样的配置文件,它可以增强项目的可维护性 常用配件文件的处理方式,包含:JSON.ini / config.YAML.XML 等 本篇文章,我们将聊聊 Pyth ...

  6. 使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源(二)

    之前写过一篇 使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源,在那之后,又陆续想到并实施了几点利用 jsDelivr 进一步加速静态资源加载的措施,新起一篇作为记录和分享. ...

  7. 【题解】CF1368C Even Picture

    \(\color{purple}{Link}\) \(\text{Solution:}\) 这是一道构造题. 题目要求恰好有\(n\)个点的四周全都是灰色点,所以直接输正方形是不行了. 考虑\(k=1 ...

  8. Magicodes.IE 2.4版本发布

    今天我们发布了2.4版本,这离不开大家对Magicodes.IE的支持,我们也对大家的意见以及需求不断的进行更新迭代,目前我们的发布频率平均在一周一个beta版本,一个月一个正式版本的更新,我们欢迎更 ...

  9. angularCroppie

    下载 angularCroppieangularCroppie 图像Cropper使用Croppie 安装 Npm: Npm安装角croppie 使用 添加依赖项:angular.模块("m ...

  10. Nuxt|Vue仿探探/陌陌卡片式滑动|vue仿Tinder拖拽翻牌效果

    探探/Tinder是一个很火的陌生人社交App,趁着国庆假期闲暇时间倒腾了个Nuxt.js项目,项目中有个模块模仿探探滑动切换界面效果.支持左右拖拽滑动like和no like及滑动回弹效果. 一览效 ...