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将非常有趣. //下面给出 ...
随机推荐
- Redis中String类型的相关命令操作
String append 如果key已存在,则直接在value追加值,如果key不存在,则会插件一个新的value为空的key,然后在追加 127.0.0.1:6379> set name l ...
- 分享一些好用的 Chrome 插件!
使用浏览器扩展程序可以使你的工作效率提高数倍不止,那么下面我就向大家分享一下我日常使用的扩展,可能大多数扩展大家都已经在使用了,不过也难免有一两个是你不知道的. 以下排名并不分先后,请坚持看到最后,或 ...
- webservice了解一下!!
(1)什么是webservice? webservice是一种可以跨编程语言和跨平台进行远程调用的一种技术,是同步进行. webservice主要分为两种,一种是基于浏览器的瘦客户端应用程序,一种是基 ...
- training set, validation set, test set的区别
training set: 用来训练模型 validation set : 用来做model selection test set : 用来评估所选出来的model的实际性能 我们知道,在做模型训练之 ...
- linux应用-线程操作
文章写得好,转载一下, https://blog.csdn.net/triorwy/article/details/80380977
- VPS教程:搭建个人网盘教程—kodexplorer
kodexplorer网盘系统.Kodexplorer,也叫芒果云.可道云.kodcloud,总之名字改了不少.但其本身作为一个网盘文件系统,还是有很多可圈可点的地方. seafile.h5ai.ko ...
- ATMEGA的SPI总线 - 第1部分
转自: 1. https://www.yiboard.com/thread-782-1-1.html 2.https://mansfield-devine.com/speculatrix/2018/0 ...
- Jmeter之『如果(If)控制器』
判断方法 ${__jexl3("${projectName}"=="${targetDir}",)} ${__groovy("${projectNam ...
- 6-kubernetes网络
1.service存在的意义 防止破的失联(服务发现) 定义一组pod的访问策略(提供负载均衡) 2.pod与service的关系 通过label-selector相关联 通过service实现pod ...
- NOI 2012 【迷失游乐园】
这道题,额,反正我是刚了2天,然后就萎了......(是不是觉得我很菜) 题目描述: 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩. 进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐 ...