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将非常有趣. //下面给出 ...
随机推荐
- 栈帧的内部结构--局部变量表(Local Variables)
每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返 ...
- Tensorflow图级别随机数设置-tf.set_random_seed(seed)
tf.set_random_seed(seed) 可使得所有会话中op产生的随机序列是相等可重复的. 例如: tf.set_random_seed(1234) a = tf.random_unifor ...
- burp suite 之 intruder(入侵者)
intruder:包括自动提交请求的功能 登录密码 撞库 注入 脱裤 Fuzz Burp intruder包含四个模块: Target:攻击的网站目标的详情信息 Positions :用来设置攻击类型 ...
- 破晓行动----带你总结JVM的知识大全(一)
JVM线程 + JVM内存区域
- 微服务实战系列(十)-网关高可用之中间件Keepalived
1.场景描述 因为要做网关的高可用,用到了keepalived+nginx,来保证nginx的高可用,如下图: 安装了keepavlived,走了一些弯路,记录下吧,nginx的安装就不多说了,博客已 ...
- Python-函数式编程-map reduce filter lambda 三元表达式 闭包
lambda 匿名函数,核心是作为算子,处理逻辑只有一行但具有函数的特性,核心用于函数式编程中 三元运算符 其实本质上是if分支的简化版,满足条件返回 if 前面的值,不满足条件返回 else后面的值 ...
- Go-注释
什么是注释? 注释是给开发人员看的,目的是降低开发人员阅读代码的时间成本和代码阅读困难程度 Go-注释内容 1. 包注释,位于某个包下Go程序文件的顶部 2. 函数注释,位于Go函数的头部 3. 代码 ...
- 软件定义网络实验记录②--Mininet 实验——拓扑的命令脚本生成
一.实验目的 掌握 Mininet 的自定义拓扑生成方法:命令行创建.Python 脚本编写 二.实验任务 通过使用命令行创建.Python 脚本编写生成拓扑,熟悉 Mininet 的基本功能. 三. ...
- 使用gettid() 注意事项
gettid()这个函数不可以在程序中直接使用,它是Linux本身的一个函数, 但是:仅包含#include <sys/types.h>,然后使用,编译时会报该函数未定义之类的错误! 解决 ...
- 我的Keras使用总结(5)——Keras指定显卡且限制显存用量,常见函数的用法及其习题练习
Keras 是一个高层神经网络API,Keras是由纯Python编写而成并基于TensorFlow,Theano以及CNTK后端.Keras为支持快速实验而生,能够将我们的idea迅速转换为结果.好 ...