两个js数组的比较,求高人答案。

cddhy 2011-06-23 10:56:53


如:
var a=['a','b','c','d','e'];
var b=['a','b','f','g','h'];

a,b内的数据都是数据库返回的,所以,都是不确定的。

a,b中有重复的,也有不重复的。
我现在需要得到a,b中重复的部分--数组c,a与b不重复的部分--数组d,b与a不重复的部分--数组e.

下面是本论坛toury用户以前为我提问的另一个问题提供的答案。
希望能对大家的思路有些帮助。
<script>
var obj=[];//创建一个空数组,用来装填关联数组
var wantArr=[]; //创建一个空数组,用来保存我们要的结果
var arr=['a','b','c','d','a','d']; //要剔除重复元素的源数组
for(var i=0;i<arr.length;i++){
//关键在这里:用arr中的每个元素值做关联数组的“关联名”;同时也用它做关联值!
//循环中,如果遇到arr的某个与前面重复的元素时,它将覆盖那个“关联名”元素!等于剔除了重复元素
obj[arr[i]]=arr[i];
}
//其实到了这里我们已经得到了想要的结果obj[];但由于它是关联数组,取值、运算不很方便,所以就多做一些工作,把它变换为纯数组wantArr[]:
//①
for(var pro in obj){
wantArr.push(obj[pro])
}
alert(wantArr)
</script>

我依然不明白obj的具体用处。也希望高手帮我解释一下obj。虽然注释说这是个关联数组。

我能力有限,没能力举一反三,没从这个例子得到我本问题的解决方法。
所以希望各位高手,帮帮忙了。

我在这个论坛也没多少分,所以不能给很多分。抱歉。
...全文
1405 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
digli 2011-09-16
  • 打赏
  • 举报
回复
借鉴了,谢谢楼主。
cddhy 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 theforever 的回复:]

引用楼主 cddhy 的回复:
我现在需要得到a,b中重复的部分--数组c,a与b不重复的部分--数组d,b与a不重复的部分--数组e.

a与b不重复的部分--数组d,b与a不重复的部分--数组e
不知你怎么想的,d和e不是一回事吗?这能有什么分别?
[/Quote]
d中元素为在a中却不在b中,e中元素为在b中却不在a中。
抱歉了,我的表达能力不好。
最后一个菜鸟 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 theforever 的回复:]

引用楼主 cddhy 的回复:
我现在需要得到a,b中重复的部分--数组c,a与b不重复的部分--数组d,b与a不重复的部分--数组e.

a与b不重复的部分--数组d,b与a不重复的部分--数组e
不知你怎么想的,d和e不是一回事吗?这能有什么分别?
[/Quote]
d中存储的是a的元素,e中存储的是b中的元素
  • 打赏
  • 举报
回复
[Quote=引用楼主 cddhy 的回复:]
我现在需要得到a,b中重复的部分--数组c,a与b不重复的部分--数组d,b与a不重复的部分--数组e.
[/Quote]
a与b不重复的部分--数组d,b与a不重复的部分--数组e
不知你怎么想的,d和e不是一回事吗?这能有什么分别?
lost_guy_in_scut 2011-08-04
  • 打赏
  • 举报
回复
这段代码让我想起了linux的shell编程啊~~估计写这段代码的是个linux达人。
打字员 2011-08-04
  • 打赏
  • 举报
回复

function compare(arr1, arr2) {
var c = [];
var d = arr1.slice(0);
var e = arr2.slice(0);
var temp;
var i = 0;
var j = 0;
Array.prototype.index = function(s) { //获取元素在数组中的下标
var temp = this.join(',');
var len = temp.length;
temp = temp.replace((new RegExp(',*' + s + '.*', 'g')), '');
var len2 = temp.length;
return len2 == len? -1 : len2? temp.split(',').length : 0;
}
while(i < d.length) {//循环比较d中的每一个元素是否在e中出现
temp = d[i];
j = e.index(temp);
if(j >= 0) {//如果d,e中都存在此元素,则在d,e数组中删除它,并将其存入c
c.push(temp);
d.splice(i, 1);
e.splice(j, 1);
} else {//如果不存在,则此元素只存在于d中,比较对象转移为d[i + 1]
i += 1;
}
}
return [c, d, e];
}

var a = ['c', 'a', 'd', 'e', 'b'];
var b = ['b', 'f', 'g', 'a', 'h', 'n'];
var re = compare(a, b);
alert(re[0]);
alert(re[1]);
alert(re[2]);
weike021996 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 q107770540 的回复:]

jQuery.unique() 去重复
http://api.jquery.com/jQuery.unique/
[/Quote]+1
  • 打赏
  • 举报
回复
我的思想是合并两个数组,然后排序,之后查验,前后两个元素相同的就提取出来,这样只是做了一次循环,排序试试js提供的函数.
cnnzp 2011-07-06
  • 打赏
  • 举报
回复
js的Array和Object对象在使用上几乎没有多少差异。
一个普通的Object你也可以当作Array来用,自己实现下length属性就行了。

var a = new Object();
a[0] = 100;
实际意思就是a有个property 0, 值为100;

a["ab"] = 100;
等价于
a.ab = 100;

. 运算符右边不能是数字,所以不能写成
a.0 = 100;
lijianc23 2011-06-28
  • 打赏
  • 举报
回复
Array.prototype.toObject=function()
{
var obj=new Object();
for(var i=0;i<this.length;i++)
{
obj[this[i]]=this[i];
}
return obj;
}
function getRepeatArray(a,b)
{
var repeatArr=[];
var repeatObject=new Object();
var aArrayObject=a.toObject();
var bArrayObject=b.toObject();
for(var key in aArrayObject)
{
bArrayObject[key]?(repeatObject[key]?repeatObject[key]++:repeatObject[key]=1):"";
}
for(var repeatObjectKey in repeatObject)
{
repeatArr.push(repeatObjectKey);
}
return repeatArr;
}

var a=["a","b","bb","c","d","ddd","11","ss","ss","ddd"];
var b=["s","1","11","bb","ss","bb","ss","11"];
var repeatArr=getRepeatArray(a,b);
alert(repeatArr);
cddhy 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pj100 的回复:]

要比较对象相等是否是比较对象的属性都相等就当作相等?
[/Quote]

这个我也不知道。
但是js里 a=[{o:1,k:2},{o:2,k:3}] b=[{o:1,k:2}]
这时的a!=b
如果a=[o:1,k:2}] b=[{o:1,k:2}]
这是a==b
具体js怎么判断的,我也不知道。但是它就是可以判读的出来。


如果数组内元素都是对象的话,那又该要怎么做?
missgd152 2011-06-24
  • 打赏
  • 举报
回复
学习了…………
kyzy_yy_pm 2011-06-24
  • 打赏
  • 举报
回复
obj[arr[i]]=arr[i];//遍历数组arr,用arr中每个元素的值作为obj数组的键(主要是去重复,楼主要知道键名是不可重复的哦,这样就将重复的去掉了,得出结果obj是array('a' => null, 'b' => null, 'c' => null, 'd' => null),其他的两个则被js规则去掉了)
cddhy 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pj100 的回复:]

JScript code

<html>

<head>

<script type="text/javascript">
var a=['a','b','c','d','e'];
var b=['a','b','f','g','h'];
var arr1 = intersection(a,b);
alert(arr1);
var arr2 = chaji(a,b);
alert(arr2);……
[/Quote]
但是如果a=[{o:1,k:2},{o:2,k:3}] b=[{o:1,k:2}]时调用inANotInB这个方法。返回arr.
arr[0].k或者arr[0].o就是undefined了。

我对于这些个方法真的不太懂。
燥动的心 2011-06-24
  • 打赏
  • 举报
回复
要比较对象相等是否是比较对象的属性都相等就当作相等?
燥动的心 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cddhy 的回复:]

引用 5 楼 pj100 的回复:

JScript code

<html>

<head>

<script type="text/javascript">
var a=['a','b','c','d','e'];
var b=['a','b','f','g','h'];
var arr1 = intersection(a,b);
alert(arr1);
var ……
[/Quote]
这个时候a,b的元素是对象,就不能这样比较了
ma1986 2011-06-23
  • 打赏
  • 举报
回复
就是让var arr=['a','b','c','d','a','d'];变成['a','b','c','d'}去除重复的
飞跃颠峰 2011-06-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 q107770540 的回复:]

jQuery.unique() 去重复
http://api.jquery.com/jQuery.unique/
[/Quote]

顶这个
q107770540 2011-06-23
  • 打赏
  • 举报
回复
jQuery.unique() 去重复
http://api.jquery.com/jQuery.unique/
挨踢直男 2011-06-23
  • 打赏
  • 举报
回复
var o = new Object();
o["z"]=1
o["z"]=2
alert(o.z)

就是把重复的覆盖掉
o["xxx"]属性创建可以这么写

你数组中 arr[0]和a[4]的值都是a

那意思不就是
obj["a"]="a"
obj["a"]="a"
执行两次,但对象中不能有重复的属性出现,所以重复的被覆盖
加载更多回复(3)

87,920

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧