前几天 有一个需求要做一个 勾选的按钮 ,用的前端框架时 extjs   。

需求是这样的:选择数据后点击勾选 会把数据 放到一个全局变量里,然后点击另外一个提交按钮 弹出一个窗口 加载这些已经勾选的数据,进行预览勾选的数据和提交。

  隐藏的需求之一就是预览的时候不能看到重复的数据,或者说勾选的时候需要去重。

实现如下:

        /**
* 添加勾选的records 并去重
* @param value 勾选的records
*/
pushExternalTickedRecords(value: Ext.data.IModel[]) {
let temp = this.ExternalTickedRecords;
if (temp == null || temp == undefined) {
temp = new Array<Ext.data.IModel>();
}
temp.push(...value);
temp.sort((a: Ext.data.IModel, b: Ext.data.IModel) => {
let aId = a.getData().Id;
let bId = b.getData().Id;
if (aId > bId) {
return 1;
} else if (aId == bId) {
return 0;
} else {
return -1;
}
});
let len = temp.length;
let objId = 0;
for (let i = 0; i < len; i++) {
let curLen = temp.length;
if (i >= curLen) {
break;
}
let curId = temp[i].getData().Id;
if (i != 0) {
if (objId == curId) {
temp.splice(i, 1);
i--;
continue;
}
}
objId = curId;
}
this.ExternalTickedRecords = temp;
}

  注:这个方法是写在一个类里的,语言TSEditer支持的ES6标准。

简单解释一下:首先根据 数据Id进行sort,然后循环这个排序后的 array 使用 splice 和 i-- 进行高性能的去重。

  注:splice 减少数组元素会影响其length 所以 要使用 len变量。如果不使用id 作为 key就要在objId里存储相应的key。objId 更准确的命名应该是 priorObj。

  注:如果不是用 splice 而使用delete 的话 不能做i--并且后面要去除 undefined。

补充:

var ages = [, , , ,,,,,,,,,];

ages.filter((m, index) => ages.findIndex(x => x == m) == index);

3,10,18,20,2,30,1

js 排序,去重的更多相关文章

  1. js数组去重的4种方法

    js数组去重,老生长谈,今天对其进行一番归纳,总结出来4种方法 贴入代码前 ,先对浏览器Array对象进行支持indexOf和forEach的polyfill Array.prototype.inde ...

  2. 排序图解:js排序算法实现

    之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...

  3. JS数组去重的几种常见方法

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  4. js数组去重五种方法

    今天来聊一聊JS数组去重的一些方法,包括一些网上看到的和自己总结的,总共5种方法(ES5). 第一种:遍历数组法 这种方法最简单最直观,也最容易理解,代码如下: var arr = [2, 8, 5, ...

  5. js数组去重的方法(转)

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  6. JS数组去重的6种算法实现

    1.遍历数组法 最简单的去重方法,实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中:注意点:判断值是否在数组的方法"indexOf"是ECMAScript5 方法 ...

  7. js数组去重解决方案

    js数组去重是前端面试中经常被问的题目,考察了面试者对js的掌握,解决问题的思路,以及是否具有专研精神.曾经一位前端界大神告诉我,解决问题的方式有很多种,解决问题时多问问自己还有没有其他的方法,探求最 ...

  8. 前端面试手写代码——JS数组去重

    目录 1 测试用例 2 JS 数组去重4大类型 2.1 元素比较型 2.1.1 双层 for 循环逐一比较(es5常用) 2.1.2 排序相邻比较 2.2 查找元素位置型 2.2.1 indexOf ...

  9. JS 数组去重(数组元素是对象的情况)

    js数组去重有经典的 几种方法 但当数组元素是对象时,就不能简单地比较了,需要以某种方式遍历各值再判断是否已出现. 因为: 1.如果是哈希判断法,对象作哈希表的下标,就会自动转换成字符型类型,从而导致 ...

  10. 利用js排序html表格

    在web前端开发中会遇到排序等功能,当然也可以用服务器端来排序,今天我做一个笔记,怎么用js来实现这些复杂的功能呢. 在学习这个之前一定得用html dom jquery 的知识,要不没有办法看明白的 ...

随机推荐

  1. Hibernate 分页 查询

    昨天的作业  分页: 主要的代码块:(明天实现分页的封装) package com.cy.beans; import java.util.List; /** * 定义一个分页对象 * @author ...

  2. k8s之安装docker-ce17.06

    1.下载rpm包 https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ https://download.docker. ...

  3. 扒一扒HTTPS网站的内幕

    215年6月,维基媒体基金会发布公告,旗下所有网站将默认开启HTTPS,这些网站中最为人所知的当然是全球最大的在线百科-维基百科.而更早时候的3月,百度已经发布公告,百度全站默认开启HTTPS.淘宝也 ...

  4. new image的使用

    在看别人的程序,用到了new image()这种方法,然而怎么看也不是很明白: 于是就上网搜,然而却没有一个人能够解开我心中的疑惑,因为没有一个人的程序是完整的, 即使我知道怎么用,但是我看不到效果就 ...

  5. linux中使用Crontab定时执行java的jar包无法使用环境变量的问题

    1.crontab简单使用 cmd 其实就是5个星星的事情,随便百度一下吧 5个时间标签用来标注执行的设定.比如每5分钟执行一次/5 * * * cmd 要特别注意 2.有些命令在命令行里执行很好,到 ...

  6. MVC应用程序显示Flash(swf)视频

    前段时间, Insus.NET有实现<MVC使用Flash来显示图片>http://www.cnblogs.com/insus/p/3598941.html 在演示中,它也可以显示Flas ...

  7. MVC应用程序实现上传文件(续)

    前几天,有练习了<MVC应用程序实现上传文件>http://www.cnblogs.com/insus/p/3590907.html 那只是把文档上传至MVC应用程序下的某一目录之中. 其 ...

  8. 自定义一个可以动态折叠的UITAbleViewCell

    看到code 4APP上有一个折叠的UITAbleViewCell,不过是swift的,所以自己尝试做一个简单的可折叠的UITAbleViewCell 主要实现一个可以折叠的UITAbleViewCe ...

  9. js 时间格式与时间戳的相互转换示例代码

    一.时间转换时间戳 function transdate(endTime){ var date=new Date(); date.setFullYear(endTime.substring(0,4)) ...

  10. Android - 自定义控件和属性(attr和TypedArray)

    http://blog.csdn.net/zjh_1110120/article/details/50976027 1.attr format 取值类型 以ShapeView 为例 <decla ...