JS如何在不给新空间的情况下给数组去重?

1、先排序,在让相邻元素对比去重

  const nums = [3, 1, 1, 5, 2, 3, 4, 3, 5, 5, 6, 4, 6, 6, 6];
  Array.prototype.arrayNorepeat = function () {
    let arr = this;
    let len = arr.length - 1;
    let i = 0;
    //先给数组排序
    for (; i < len; ++i) {
      let j = 0;
      for (; j < len - i; ++j) {
        if (arr[j] > arr[j + 1]) {
          arr[j] = arr[j] + arr[j + 1];
          arr[j + 1] = arr[j] - arr[j + 1];
          arr[j] = arr[j] - arr[j + 1];
        }
      }
    }
    //对数组进行去重
    for (i = 0; i < arr.length; ++i) {
      if (arr[i] === arr[i + 1]) {
        arr.splice(i, 1);
        //一旦相邻两个元素相等,外层循环的初始值从0开始
        i = -1;
      }
    }
    return arr;
  }
  console.log(nums.arrayNorepeat());

2、直接去重(排序方式是按照初始的排序方式)

  const nums = [3, 1, 1, 5, 2, 3, 4, 3, 5, 5, 6, 4, 6, 6, 6];
  Array.prototype.arrayNorepeat = function () {
    let arr = this;
    let i = 0;
    for (; i < arr.length; ++i) {
      let j = 0;
      for (; j < arr.length; ++j) {
        if (i != j) {
          if (arr[i] === arr[j]) {
            //如果你想保留最后一个重复的数字,把splice方法的j改成i就可以了
            arr.splice(j, 1);
            //一旦相邻两个元素相等,外层循环的初始值从0开始
            i = -1;
          }
        }
      }
    }
    return arr;
  }
  console.log(nums.arrayNorepeat());

原文地址:https://www.cnblogs.com/onebox/p/8110904.html

时间: 2024-10-13 10:07:14

JS如何在不给新空间的情况下给数组去重?的相关文章

不占用任何额外空间的情况下交换两个数的值

题目 假如有x.y两个数,如何在不占用任何额外空间的情况下交换两个数的值? 思路 平时我们在交换两个数的值时,往往会用一个中间数temp来实现效果,现在需要不占用任何额外空间,自然就不能使用这种寻常的方法了:这里可以有两种方法来实现. 方法一 int x = 5; int y = 10; x = x + y; y = x - y; x = x - y; 先将两个数之和附给x,接着x-y自然就是原本x的值,这时候赋值给y,y就拿到了x原本的值.此时x依然是两个数之和,再进行x-y自然就是原本x的值

在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串

1 import java.util.*; 2 3 public class Reverse { 4 public String reverseString(String iniString) { 5 char []initchar=iniString.toCharArray(); 6 int len=initchar.length; 7 for(int i=0;i<len/2;i++){ 8 char temp=initchar[len-i-1]; 9 initchar[len-i-1]=in

JS 不声明第三个变量的情况下实现两数变换

1. 1 var a = 1; 2 var b = 2; 3 a = a + b; //3 4 b = a - b; //1 5 a = a - b; //2 6 console.log(a); 7 //2 8 console.log(b); 9 //1 2. var a = 1; var b = 2; a ^= b; b ^= a; a ^= b; console.log(a); //2 console.log(b); //1 console.log((a ^= b) === (a ^ b)

原生JS数组去重的几种方法

有时候我们做项目的时候往往会需要把数组里面一些重复的项去掉,但是原生JS有排序,有筛选等等,但是就是没有数组去重怎么办呢?这能怎么办,自己手动实现嘛.(以下代码直接在原型上添加的的方法,为的就是和原生JS方法类似)可以达到Array.xxx()这样的效果 第一种方法:创建空数组利用indexOf方法检测就数组的项是否在新数组中. Array.prototype.unique=function(){ var arr=[];//创建新数组 for(var i=0;i<this.length;i++)

JS 数组常见操作汇总,数组去重、降维、排序、多数组合并实现思路整理

壹 ? 引 JavaScript开发中数组加工极为常见,其次在面试中被问及的概率也特别高,一直想整理一篇关于数组常见操作的文章,本文也算了却心愿了. 说在前面,文中的实现并非最佳,实现虽然有很多种,但我觉得大家至少应该掌握一种,这样在面试能解决大部分数组问题.在了解实现思路后,日常开发中结合实际场景优化实现,提升性能也是后期该考虑的. 本文主要围绕数组去重.数组排序.数组降维.数组合并.数组过滤.数组求差集,并集,交集,数组是否包含某项等知识点展开,附带部分知识拓展,在看实现代码前也建议大家先自

opencv图像原地(不开辟新空间)顺时旋转90度

前一阵朋友碰到这么一道题:将图像原地顺时针旋转90度,不开辟新空间.此题看似平易(题目简短),仔细研究发现着实不容易.经过一番探索后,终于找到了正确的算法,但是当使用opencv实现时,有碰到了困难而且费了一番周折才找到问题所在. 首先,解决这个问题,先简化成原地90度旋转一M×N的矩阵A(注意不是N×N方阵).对于2×3的矩阵A = {1,2,3;4,5,6},其目标为矩阵B = {4,1;5,2;6,3}.因为是原地旋转,这里A和B应指向同一大小为6的内存空间. 这里有这样一个重要的导出公式

JS时间轴效果(类似于qq空间时间轴效果)

2013-11-04 23:51 by 空智, 4041 阅读, 15 评论, 收藏, 编辑 在上一家公司写了一个时间轴效果,今天整理了下,感觉有必要写一篇博客出来 给大家分享分享 当然代码还有很多不足的地方,希望大家多指点指点下,此效果类似于QQ空间或者人人网空间时间轴效果,当时也是为了需求 研究了下qq空间逻辑(当然JS代码压缩了肯定看不到的),只是当时研究了下他们HTML结构和css结构,所以仿照他们那种逻辑自己也写了一个出来.先来看看是个什么样的吧!如下图所示: 需求分析:左侧是一个时间

本地测试好的DEDE织梦程序怎么上传到新空间

第一步:先将本地的数据库进行备份,(准备到新空间后进行数据还原).第二步:在新空间安装好dede程序,在安装时,可以将用户名和密码取为和本地环境一至的.第三步:登陆新空间,并在新空间的后台对新空间进行数据备份:(目的是将新空间的admin表备份下来),原后将data/backup文件夹中的admin表和/INCLUDE/common.inc.phpdata/common.inc.php 这三个文件通过ftp回传到本地的一个文件夹中,以备后用.第四步:将本地环境中的整站程序全部上传到空间进行覆盖安

JS~模拟表单在新窗口打开,避免广告拦截

说起广告拦截,这应该是浏览器的一个特性,它会将window.open产生的窗口默认为一个广告,将它进行拦截,但有时,这不是我们所希望的,有时,我们就是需要它在客户端的浏览器上弹出一个新窗口,以展示数据处理的更新结果,例如,一个创建商品的预览功能,它需要先保存数据,然后再在新窗口展示最新的信息,这种需求并不少,而大多数人的作法就是使用window.open去弹窗口,但它确实不是一种好的方式! 新方式来了 我们知道表单提交实际上可以把POST的结果响应到新窗口上,我们就是利用表单的这种性质,在JS中