你的位置:
问答吧
-> JavaScript
-> 问题详情
JS合并数组并去重
提示:您可以先修改部分代码再运行
以上是我写的合并数组并去重,谁还有更好的办法贴出来参考参考
作者: fly124.cn
发布时间: 2008-07-21
var a=["1","2","3"],b=["3","4","5","1"];
for(var i=0,j=0,ci,r={},c=[];ci=a[i++]||b[j++];){
if(r[ci])continue;
r[ci]=1;
c.push(ci);
}
alert(c);
作者: campaign
发布时间: 2008-07-21
[复制]Code:
/**
* each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数
* 这个迭代函数依次将集合的每一个元素和可选参数用函数进行计算,并将计算得的结果集返回
{%example
var a = [1,2,3,4].each(function(x){return x > 2 ? x : null});
var b = [1,2,3,4].each(function(x){return x
alert(a);
alert(b);
%}
* @param {Function} fn 进行迭代判定的函数
* @param more ... 零个或多个可选的用户自定义参数
* @returns {Array} 结果集,如果没有结果,返回空集
*/
Array.prototype.each = function(fn){
fn = fn || Function.K;
var a = [];
var args = Array.prototype.slice.call(arguments, 1);
for(var i = 0; i
var res = fn.apply(this,[this[i],i].concat(args));
if(res != null) a.push(res);
}
return a;
};
/**
* 得到一个数组不重复的元素集合
* 唯一化一个数组
* @returns {Array} 由不重复元素构成的数组
*/
Array.prototype.uniquelize = function(){
var ra = new Array();
for(var i = 0; i
if(!ra.contains(this[i])){
ra.push(this[i]);
}
}
return ra;
};
/**
* 求两个集合的补集
{%example
var a = [1,2,3,4];
var b = [3,4,5,6];
alert(Array.complement(a,b));
%}
* @param {Array} a 集合A
* @param {Array} b 集合B
* @returns {Array} 两个集合的补集
*/
Array.complement = function(a, b){
return Array.minus(Array.union(a, b),Array.intersect(a, b));
};
/**
* 求两个集合的交集
{%example
var a = [1,2,3,4];
var b = [3,4,5,6];
alert(Array.intersect(a,b));
%}
* @param {Array} a 集合A
* @param {Array} b 集合B
* @returns {Array} 两个集合的交集
*/
Array.intersect = function(a, b){
return a.uniquelize().each(function(o){return b.contains(o) ? o : null});
};
/**
* 求两个集合的差集
{%example
var a = [1,2,3,4];
var b = [3,4,5,6];
alert(Array.minus(a,b));
%}
* @param {Array} a 集合A
* @param {Array} b 集合B
* @returns {Array} 两个集合的差集
*/
Array.minus = function(a, b){
return a.uniquelize().each(function(o){return b.contains(o) ? null : o});
};
/**
* 求两个集合的并集
{%example
var a = [1,2,3,4];
var b = [3,4,5,6];
alert(Array.union(a,b));
%}
* @param {Array} a 集合A
* @param {Array} b 集合B
* @returns {Array} 两个集合的并集
*/
Array.union = function(a, b){
return a.concat(b).uniquelize();
};
[ 本帖最后由 月影 于 2008-7-21 15:29 编辑 ]
作者: 月影
发布时间: 2008-07-21
第一次看月老大的代码,,
能看懂50%。。。。
难道自己真的进步了?
作者: 西门轩辕
发布时间: 2008-07-21
多谢两位的答案。暂时还没看得很明白,下来之后再慢慢品味;
嘿嘿,其实我的代码还是通俗易懂的!
作者: fly124.cn
发布时间: 2008-07-21
campaign 的思路可以具体讲下吗?看你很多地方用了这个方法。。
作者: okwxj
发布时间: 2008-07-22
思路就是利用对象的特性,用r[ci]看对象中是否有这个属性,如果有,就证明该数已存在,这样的好处,就是r[ci]就可以判断是否存在,而不用在遍历新的数组看是否存在
作者: campaign
发布时间: 2008-07-22
ci=a[i++]||b[j++] 这个有隐患……
比如这个——
a=["1",false,{}],b=["3",0,-2,true];
作者: 月影
发布时间: 2008-07-22
我这么写就是为了偷懒,不再写第二个for循环,这个效率不高,因为第一个遍历完,在遍历第二个时,会每次判断第一个是否成立,版主,我这么写,是提前知道,数组里都是什么,不会出现false、0这种元素的情况
作者: campaign
发布时间: 2008-07-22
嗯,我只是说代码不够“安全”而已,这个问题用hash不用写第二个循环
作者: 月影
发布时间: 2008-07-22
也来偷懒一下
,安全的还是要看月版的
提示:您可以先修改部分代码再运行
作者: 编程浪子
发布时间: 2008-07-22
用hash就是可以写少一次循环
作者: sp42
发布时间: 2008-07-22