function unique(arr){    
  if(!isArrayLink(arr)){ //不是类数组对象

    return arr

  }

  let result = []

  let objarr = []

  let obj = Object.create(null)

  arr.forEach(item => {

    if(isStatic(item)){//是除了symbol外的原始数据

      let key = item + '_' + getRawType(item);

      if(!obj[key]){

        obj[key] = true

        result.push(item)

      }

    }else{//引用类型及symbol

      if(!objarr.includes(item)){

        objarr.push(item)

          result.push(item)

      }

    }

  })

  return resulte
}

Set简单实现

window.Set = window.Set || (function () {    
  function Set(arr) {

    this.items = arr ? unique(arr) : [];

    this.size = this.items.length; // Array的大小

  }

  Set.prototype = {

    add: function (value) {

      // 添加元素,若元素已存在,则跳过,返回 Set 结构本身。

      if (!this.has(value)) {

        this.items.push(value);

        this.size++;

      }

      return this;

    },

    clear: function () {

      //清除所有成员,没有返回值。

      this.items = []

      this.size = 0

    },

    delete: function (value) {

      //删除某个值,返回一个布尔值,表示删除是否成功。

      return this.items.some((v, i) => {

        if(v === value){

          this.items.splice(i,1)

          return true

        }

        return false

      })

    },

    has: function (value) {

      //返回一个布尔值,表示该值是否为Set的成员。

      return this.items.some(v => v === value)

    },

    values: function () {

      return this.items

    },

  }

  return Set;
}());


unique:数组去重,返回一个新数组的更多相关文章

  1. concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

    var arr1 = ['a', 'b', 'c']; var arr2 = ['d', 'e', 'f']; var arr3 = arr1.concat(arr2); // arr3 is a n ...

  2. JS对象 数组连接 concat() 方法用于连接两个或多个数组。此方法返回一个新数组,不改变原来的数组。 语法 arrayObject.concat(array1,array2,.arrayN)

    concat() 方法用于连接两个或多个数组.此方法返回一个新数组,不改变原来的数组. 语法 arrayObject.concat(array1,array2,...,arrayN) 参数说明: 注意 ...

  3. js中实现截取数组的后几个元素作为一个新数组的方法

    有时候我们会遇到这种需求,截取数组中后5个元素作为一个新数组,且顺序不能变.数组中的slice()方法和splice()方法都可以实现这样的操作. const arr = [1,2,7,2,6,0,3 ...

  4. filter() 方法创建一个新数组

    filter快速过滤创建一个新数组 var new_array = arr.filter(callback(element[, index[, array]])[, thisArg]) 参数节 cal ...

  5. 软件工程结对开发——返回一个整数数组中最大子数组的和(JAVA)

    题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整型数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为 ...

  6. 返回一个整数数组中最大子数组的和——java程序设计

    一.题目要求 1.输入一个整形数组,数组里有正数也有负数.2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.3.求所有子数组的和的最大值.要求时间复杂度为O(n) 二.设计思想 解决 ...

  7. js遍历数组随机返回指定的数组结果

    ////随机生成数组中自定义的个数返回一个字符串数组    function getArrayItems(arr, num) {        //新建一个数组,将传入的数组复制过来,用于运算,而不要 ...

  8. 直接提交一个form表单后台返回一个新页面通过target属性可以放到iframe当中

    问题描述: 我想提交一个form表单后台直接返回一个新页面,但是当前页面还不想被替换掉: 解决方案: 在页面中添加一个iframe将form表单的target属性设置为iframe的id这样的话返回的 ...

  9. Array 数组filter()方法,遍历数组返回符合条件的一个新数组

    <script> const arr = [ { id: 1, name: "aa", isDone: false }, { id: 2, name: "bb ...

  10. javaScript 获取对象数组的对象里面想要的属性,返回一个新的数组

    // obj 数组 或者 对象 // arr 要获取对象数组的对象的key数组 // addProperty 可以往对象数组的每一个对象添加一个新的属性 reducedFilter(obj, arr, ...

随机推荐

  1. C#基础 - Task

    目录 前言 1,Task的分类 2,Task的状态 2.1 TaskStatus枚举 2.2 状态相关属性 2.3 小结 3,Task的等待 3.1 Wait方法 3.2 死锁 3.2.1 死锁形成 ...

  2. Windows添加软件开机自启动

    两种方式 1.添加快捷方式到开始菜单 打开我的电脑找到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup 文件夹, 如果难找的话可 ...

  3. Shell 目录栈操作

    Shell 目录栈允许你将一系列目录压入栈中,然后方便地在这些目录之间进行切换.以下是一些常见的命令及其用途: 常见命令 pushd:将当前目录压入栈中,并切换到指定目录. popd:从栈中移除顶部的 ...

  4. c++ 命名的强制类型转换

    显式转换:显式将一种类型转换为另一种类型. References: C++中的显示数据类型转换 与命名的强制类型转换相比,旧式的强制类型转换从表现形式上来说不那么清晰明了,容易被看漏,所以一旦转换过程 ...

  5. Atziluth's Last Contest. 001题解

    被dalaoYHH爆虐 问题 H:mcd 题目描述 给出两个长为 \(n\) 的数列 \({a_n},{b_n}\),保证 \(a_i\le b_i(i=1,2,\cdots,n)\). 现在您需要对 ...

  6. Locust 进行分布式负载测试

    什么是 Locust Locust 是一个开源的负载测试工具,用于测试网站和其他应用程序的性能.它通过编写 Python 脚本来定义虚拟用户的行为,模拟这些用户对目标系统发起请求.Locust 提供了 ...

  7. DECL: 针对噪声时间序列的去噪感知对比学习《Denoising-Aware Contrastive Learning for Noisy Time Series》(时间序列、对比学习、去噪)

    今天是2024年9月12日,组会摸鱼,很久没看论文了,在摸鱼看代码,最近IJCAI 2024出来了,找了几篇论文看,首先这是第一篇. 论文:Denoising-Aware Contrastive Le ...

  8. 学习高校课程-软件设计模式-OOP 和 UML 类图 OOP 与 Java(lec1)

    Lecture 1:OOP and UML Class DiagramsOOP with Java OOP 和 UML 类图 OOP 与 Java Object-Oriented Programmin ...

  9. .Net 6 SignalR 实际业务开发中遇到的问题及解决办法

    一.SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Server-Sent Events(SSE)服务器事件 3.longpolling 长轮询. 如果客户端开启协商,会按顺序 ...

  10. 完美转发(模板)--T&&

    在C++模板编程中,完美转发(Perfect Forwarding)是一种技术,旨在保留函数参数的值类别,即在将参数传递到另一个函数时,无论参数是左值还是右值,都能够保持它的原始性质,而不会因为转发丢 ...