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

使用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. 获取NX装配结构信息

    最近在做一个项目,需要获取NX装配结构信息,这里把代码分享给大家,希望对各位有帮助,注意以下几点: 1)代码获取了PART的属性.表达式等,因此一些细节可能需要您根据实际情况修改. 2)读写XML用的 ...

  2. Pycharm默认输入状态是insert状态,选中文字无法直接输入替换或删除

    最近在学习Python,使用pycharm的时候,我的光标处于加粗状态,也就是编程软件经常出现的insert插入编辑模式,我就点击了一下insert按键,退出了这个模式,但是我每次打开都是会处于这种模 ...

  3. ABP+WorkflowCore+jsplumb实现工作流

    前言 ABP目前已经是很成熟的开发框架了,它提供了很多我们日常开发所必须的功能,并且很方便扩展,让我们能更专注于业务的开发.但是ABP官方并没有给我们实现工作流. 在.net core环境下的开源工作 ...

  4. node中的cookie

    为什么需要cookie 我们知道http是无状态的协议,无状态是什么意思呢?我来举一个小例子来说明:比如小明在网上购物,他浏览了多个页面,购买了一些物品,这些请求在多次连接中完成,如果不借助额外的手段 ...

  5. 点、像素、分辨率、PPI、DPI等

    屏幕尺寸 屏幕尺寸是屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米. pixel 像素,它是组成图片的最小单元,代表红绿蓝等各种颜色. dot 点,它是屏幕发光.cmos感光的最小物理单元,水平 ...

  6. unsigned int 和 int

    就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是 ...

  7. 加快ASP。NET Core WEB API应用程序。第2部分

    下载source from GitHub 使用各种方法来增加ASP.NET Core WEB API应用程序的生产力 介绍 第1部分.创建测试RESTful WEB API应用程序第2部分.增加了AS ...

  8. XML流操作

    /// <summary>         /// 保存XML为指定格式         /// </summary>         /// <param name=& ...

  9. Docker学习:(一)初识Docker

    Docker(容器虚拟化技术)要点(秒级启动) Docker的WWH公式学习 What[是什么]. Why[为什么要用它]. How[怎么用] 1.Docker简介 (1)问题:为什么会有docker ...

  10. Redis 的完整安装过程

    Windos 版本安装 Redis 官方并不支持 Window 版本,但是微软公司在 Github 上维护了一个 Windows 版本的 Redis 项目,供 Windows 用户下载使用. 下载地址 ...