2012年12月14日 星期五

javascript將陣列合併(merge)

javascript 要將陣列合併,可以使用 concat 方法,
範例如下
var arr1 = ["a","b"];
var arr2 = ["b", "c"];
var arr3 = arr1.concat(arr2);//合併後得到["a","b","b","c"]


但用 concat 合併,不會去除重複的元素。
可再自訂一個方法,將重複元素去除
Array.prototype.my_unique = function() {
    var a = this.concat();//使用concat()再複製一份陣列,避免影響原陣列
    for(var i=0; i<a.length; ++i) {
        for(var j=i+1; j<a.length; ++j) {
            if(a[i] === a[j])
                a.splice(j, 1);
        }
    }

    return a;
};


//範例即可修改為
var arr1 = ["a","b"];
var arr2 = ["b", "c"];
var arr3 = arr1.concat(arr2).my_unique();//合併後得到["a","b","c"]



備註:
  • 用 Array.prototype 新增一個方法,則所有的 array 都可使用。
  • 用 Array.prototype 新增一個方法後,如果想要用 for... in... 的方式,遍歷所有的 array 元素,則會將自訂的方法也列出。例如
    var arr=["one","two"];
    for (var x in arr){
       alert(arr[x]);
       //除了會列出one、two兩個元素,還會列出自訂的my_unique方法
    }
    
    所以用了 Array.prototype,若要訪問所有的 array 元素,則須用
    var arr=["one","two"];
    var len=arr.length;
    for (var x=0; x<len; x++){
       alert(arr[x]);
       //僅列出one、two兩個元素
    }
    
  • 若想避免 Array.prototype 對 for...in... 的影響,也可改寫成單純的 function 來使用
    function my_unique(a) {
        var a = a.concat();//使用concat()再複製一份陣列,避免影響原陣列
        for(var i=0; i<a.length; ++i) {
            for(var j=i+1; j<a.length; ++j) {
                if(a[i] === a[j])
                    a.splice(j, 1);
            }
        }
    
        return a;
    };
    var arr1=["a","b"];
    var arr2=["b","c"];
    var arr3 = my_unique(arr1.concat(arr2));//得到["a","b","c"]

2 則留言: