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)]
// 一步到位
js扩展方法(数组不重复推入)的更多相关文章
- JS扩展方法——字符串trim()
转自:http://www.cnblogs.com/kissdodog/p/3386480.html <head> <title>测试JS扩展方法</title> ...
- JS扩展方法
JS扩展方法与C#的扩展方法非常相似,也是可以链式调用的,也是通过对某个类的扩展写法来实现.这个东西非常好用,如果将预先写好的方法放到一个js里面引用的话,那么后面写js将非常有趣. 下面给出一个例子 ...
- JS 扩展方法prototype
通过类对象的prototype设置扩展方法,下面为String对象增加quote(两边加字符)方法 <script type="text/javascript"> St ...
- Js中去除数组中重复元素的6种方法
方法一: Array.prototype.method1 = function(){ var arr=[]; //定义一个临时数组 for(var i = 0; i < this.length; ...
- JS 清除字符串数组中,重复元素
<script language="JavaScript"> <!-- var arrData=new Array(); for(var i=0; i<10 ...
- Js扩展方法ReplaceAll
String.prototype.replaceAll = function (reallyDo, replaceWith, ignoreCase) { if (!RegExp.prototype.i ...
- 添加一个js扩展方法
String.prototype.repeatify=String.prototype.repeatify || function(times){ var str=''; for(var i=0;i& ...
- Array js扩展方法 forEach()
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- js一些方法的扩展
//JS扩展方法与C#的扩展方法非常相似,也是可以链式调用的,也是通过对某个类的扩展写法来实现.这个东西非常好用,如果将预先写好的方法放到一个js里面引用的话,那么后面写js将非常有趣. //下面给出 ...
随机推荐
- vue 项目中实时请求接口 建立长连接
需求:在项目中需要每隔五秒请求一次接口 第一种方法:直接在mounted钩子函数中处理 mounted() { window.setInterval(() => { setTimeout(thi ...
- python与Oracle
1.python 3.6.6 2.使用cx_Oracle -----------安装方法:pip install cx_Oracle 3.游标 cursor -----游标是系统为用户开创的 ...
- breakpad系列(2)——在Linux中使用breakpad
本文来自breakpad源码目录中doc目录下的linux_starter_guide.md,建议直接去看原文. 如何将breakpad添加进你的Linux程序 本文档是在Linux上使用Breakp ...
- python的全局函数
1.Python的全局函数 import builtins dir(builtins) abs # 返回参数的绝对值 可以写成函数:def absnum): if num >=0: retu ...
- DOJO dataGrid 单击单元格选中行
onCellClick: lang.hitch(this, function(event){ //单元格单击事件 var grid = dijit.byId("__geodisa_grid& ...
- VS2013 C++ 生成与调用DLL(动态链接库) 需要验证
转载:https://blog.csdn.net/s978697043/article/details/82429802 一.创建动态链接库(生成.dll .lib 两个文件) 文件→新建→项目 选择 ...
- Java (四)APACHE Commons IO 复制文件
上一篇:Java (三)APACHE Commons IO 常规操作 例1:复制文件 1 import java.io.File; 2 import java.io.IOException; 3 4 ...
- Python 的映射数据类型有哪些?零基础小白入门学习必看
1 映射类关系 Python 的 collections.abc 模块内拥有 Mapping 和 MutableMapping 这两个抽象基类,它们为 dict 和其他类似的类型提供了接口定义. mu ...
- 系统编程-文件IO-IO处理方式
IO处理五种模型 .
- Microsoft.VisualBasic.dll内置的判断变量类型的一系列实用方法
今天意外读到一线码农的一篇文章<挖一挖C#中那些我们不常用的东西之系列(2)--IsXXX 系列方法>,文章中讲到 Microsoft.VisualBasic.dll 里面的Informa ...