js数组去重就是把数组中重复的元素去掉:
Array.prototype.delRepeat=function(){
var newArray=new Array();
var len=this.length;
for (var i=0;i<len ;i++){
for(var j=i+1;j<len;j++){
if(this[i]===this[j]){
j=++i;
}
}
newArray.push(this[i]);
}
return newArray;
}
但是很明显这里有for循环内嵌了另一个for循环,在大数据量下肯定非常耗时!效率低下!经过查找和高人指点优化了一个新方法:
Array.prototype.delRepeat=function(){
var newArray=[];
var provisionalTable = {};
for (var i = 0, item; (item= this[i]) != null; i++) {
if (!provisionalTable[item]) {
newArray.push(item);
provisionalTable[item] = true;
}
}
return newArray;
}
就是使用一个临时的provisionalTable对象,将数组的值作为provisionalTable对象的键值,如果相应的值不存在就将这个数组的值push到新数组中。
效率是提高了,但是有个bug,就是假设数组中换用可转换的数字和字符串,比如数组[6,"6"]这时候就好被去掉一个。悲剧,同时求解决方法。
如果你读了我的文章,觉得有帮助:
说明
发表评论



Array.prototype.delRepeat=function(){
var newArray= [];
var tmpObj = {};
var len=this.length;
for (var i=0;i<len ;i++){
tmpObj[this[i]]= this[i];
}
for(var x in tmpObj) {
newArray.push[x];
}
return newArray;
}
[回复]
看这里
http://www.welefen.com/javascript-array-unique.html
[回复]
Array.prototype.delRepeat=function(){
var newArray=[];
var provisionalTable = {};
for (var i = 0, item; (item= this[i]) != null; i++) {
var s = typeof(item) + item;
if (!provisionalTable[s]) {
newArray.push(item);
provisionalTable[s] = true;
}
}
return newArray;
}
[回复]
@acsu 感谢一下!这个方法很好,解决了字符串和数字问题,但是效率和我的第一个差不多,原因可能是for循环中定义变量中typeof操作有关
[回复]
@路人 感谢一下!这个方法很好,不过有个小bug,应该是:
Array.prototype.delRepeat=function(){
var newArray= [];
var tmpObj = {};
var len=this.length;
for (var i=0;i<len ;i++){
tmpObj[this[i]]= this[i];
}
for(var x in tmpObj) {
newArray.push(x);
}
return newArray;
}
不过没有解决数字和字符串的转换问题。
[回复]
结合acsu 和 路人 的方法:
Array.prototype.delRepeat = function(){
var newArray = [];
var tmpObj = {};
var len = this.length;
for (var i = 0; i < len; i++) {
tmpObj[typeof(this[i])+this[i]] = this[i];
}
for (var x in tmpObj) {
newArray.push(tmpObj[x]);
}
return newArray;
}
效率还是和我第一个两个for的效率差不多!悲剧!
[回复]
检查:
provisionalTable[item+1]
或
provisionalTable[typeof item + item]
[item+1] 应该效率稍微高些, 比文中方法 1 效率高, 但是比 2 肯定要低一些, 多了个计算
[回复]
之前看到的一种做法是在provisionalTable中存储的键值做加法运算。
Array.prototype.delRepeat=function(){
var newArray=[];
var provisionalTable = {};
for (var i = 0, item; (item= this[i]) != null; i++) {
if (!provisionalTable[0+item]) {
newArray.push(item);
provisionalTable[0+item] = true;
}
}
return newArray;
}
但是这样就没办法对对象类型的数据进行去除重复项的操作了。。
[回复]
数组去重有个很需要考虑的东西.如果是
[{},{},{}]似乎就基本无解了.
[回复]
附上我写的代码..
Array.prototype.delRepeat=function(){
var newArray=[];
var provisionalTable = {};
for (var i = 0, item; (item= this[i]) != null; i++) {
if (provisionalTable[item] !== item) {
newArray.push(item);
provisionalTable[item] = item;
}
}
return newArray;
}
var a = ['6',6,7,8,9,2,3,5,3,2,5];
alert(a.delRepeat()[0]+1);
[回复]
看后才知道,自己是js菜鸟。还要多加学习
[回复]
以前做过测试,零时对象方式是效率最高的。
这是我的方式:
Array.prototype.unique = function () {
var temp = new Array();
this.sort();
for(i = 0; i < this.length; i++) {
if( this[i] == this[i+1]) {
continue;
}
temp[temp.length]=this[i];
}
return temp;
}
sort()可以自定义对比函数,但是效率比较低.
http://www.webucd.com/archives/168
[回复]
不错的讨论,我也写过一篇这方面的文章,互相学习:
http://www.ilovejs.net/archives/959
[回复]
Array.prototype.distinct=function(){
var result=[];
var provisionalTable = {};
for (var i = 0, item; (item= this[i]) != null; i++) {
if (provisionalTable[item]!==item) {
result.push(item);
provisionalTable[item] = item;
}
}
return result;
}
如果要深层去重,如剔除具有完全相同属性和值的object,代码如下:
Array.prototype.distinct=function(){
var result=[];
function isSame(o1,o2){
if(!o1||!o2)return false;
var b=true;
for(var c in o1){
if(!o2[c])return false;
if(typeof o1[c]==”object”){
b=isSame(o1[c],o2[c]);
}else if(o1[c]!==o2[c]){
return false;
}
}
return b;
}
var provisionalTable = {};
for (var i = 0, item; (item= this[i]) != null; i++) {
if (!isSame(provisionalTable[item],item)) {
result.push(item);
provisionalTable[item] = item;
}
}
return result;
}
[回复]
我提供一个方法:
function distinct(arr){
var self = arr;
var _a = arr.concat().sort();
_a.sort(function(a,b){
if(a === b){
var n = self.indexOf(a);
self.splice(n,1);
}
});
return self;
}
[回复]
把if里面判断的条件给改一下,可以改成这样:
Array.prototype.unique = function () {
var tempArr = [];
var tempObj = {};
for (var i = 0; i < this.length; i++) {
if (!(this[i] in tempObj) || !(this[i] === tempObj[this[i]])) {
tempArr.push(this[i]);
tempObj[this[i]] = this[i]; // 这个可以用保存重复的元素
}
}
return tempArr;
}
var test = [1,1,1,1,'1','abc'];
alert(test.unique());
[回复]
这个好,解决了我的一个困扰了很久的问题
[回复]