如:
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。虽然注释说这是个关联数组。我能力有限,没能力举一反三,没从这个例子得到我本问题的解决方法。
所以希望各位高手,帮帮忙了。我在这个论坛也没多少分,所以不能给很多分。抱歉。

解决方案 »

  1.   

    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"
    执行两次,但对象中不能有重复的属性出现,所以重复的被覆盖
      

  2.   

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

  3.   

    就是让var arr=['a','b','c','d','a','d'];变成['a','b','c','d'}去除重复的
      

  4.   


    <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);
    var arr3 = inANotInB(a,b);
    alert(arr3);
    //a,b中重复的部分
    function intersection(a,b){
      var obj = new Object();
      for(var i =0,len = a.length;i<len;i++){
        obj[a[i]] = a[i];
      }
      for(var i =0,len = b.length;i<len;i++){
        obj[b[i]] = b[i];
      }
      var arr = new Array();
      var i = 0; 
      for(var per in obj){
        arr[i++] = obj[per];
      }
      return arr;
    }
    //a与b不重复的部分
    function chaji(a,b){
       var obj = new Object();
      for(var i =0,len = a.length;i<len;i++){
        obj[a[i]] = 1;
      }
      for(var i =0,len = b.length;i<len;i++){
        obj[b[i]] = obj[b[i]]?2:1;
      }
      var arr = new Array();
      var i = 0; 
      for(var per in obj){
        if(obj[per] == 1){
          arr[i++] = per;
        }
      }
      return arr;
    }//b与a不重复的部分
    function inANotInB(a,b){
    var obj = new Object();
    for(var i =0,len = a.length;i<len;i++){
    obj[a[i]] = 1;
    }
    for(var i =0,len = b.length;i<len;i++){
    if(obj.hasOwnProperty(b[i])){
    obj[b[i]] = undefined;
    }
    }
    var arr = new Array();
    var i = 0; 
    for(var per in obj){
    if(obj[per]){
    arr[i++] = per;
    }
    }
    return arr;
    }</script>
    </head><body></body></html> 
      

  5.   

    呃。这是依次输出的结果:
    a,b,c,d,e,f,g,h
    c,d,e,f,g,h
    c,d,e
    谢谢了。有了您的这些代码,我就能做了。
    第一次见hasOwnProperty。学习了。
      

  6.   

    但是如果a=[{o:1,k:2},{o:2,k:3}] b=[{o:1,k:2}]时调用inANotInB这个方法。返回arr.
    arr[0].k或者arr[0].o就是undefined了。我对于这些个方法真的不太懂。
      

  7.   

    obj[arr[i]]=arr[i];//遍历数组arr,用arr中每个元素的值作为obj数组的键(主要是去重复,楼主要知道键名是不可重复的哦,这样就将重复的去掉了,得出结果obj是array('a' => null, 'b' => null, 'c' => null, 'd' => null),其他的两个则被js规则去掉了)
      

  8.   


    这个我也不知道。
    但是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怎么判断的,我也不知道。但是它就是可以判读的出来。
    如果数组内元素都是对象的话,那又该要怎么做?
      

  9.   

    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);
      

  10.   

    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;
      

  11.   


    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]);
      

  12.   

    这段代码让我想起了linux的shell编程啊~~估计写这段代码的是个linux达人。
      

  13.   

    a与b不重复的部分--数组d,b与a不重复的部分--数组e
    不知你怎么想的,d和e不是一回事吗?这能有什么分别?
      

  14.   

    d中存储的是a的元素,e中存储的是b中的元素
      

  15.   

    d中元素为在a中却不在b中,e中元素为在b中却不在a中。
    抱歉了,我的表达能力不好。