1. 程式人生 > >JS 陣列去重(陣列元素是物件的情況)

JS 陣列去重(陣列元素是物件的情況)

js陣列去重有經典的 幾種方法

但當陣列元素是物件時,就不能簡單地比較了,需要以某種方式遍歷各值再判斷是否已出現。

因為:

1.如果是雜湊判斷法,物件作雜湊表的下標,就會自動轉換成字元型型別,從而導致所有元素都相等,這時判斷方法不再有意義。一般最後陣列就只剩一個

2.如果是直接比較法,則因為物件在記憶體中是按引用訪問的,屬性值相同的物件也不會相等,簡單的直接判斷不再有意義。一般最後陣列還是原樣

所以就需要進行值的比較

當然了,也可以換著法來將相應物件轉為字串(不是預設的那種[object Object])

舉個例子:

var array = [
    {a:1,b:2,c:3,d:4},
    {a:11,b:22,c:333,d:44},
    {a:111,b:222,c:333,d:444},
    {a:11,b:22,c:33,d:44},
    {a:11,b:22,c:33,d:444}
    ];
方法為
//將物件元素轉換成字串以作比較
function obj2key(obj, keys){
    var n = keys.length,
        key = [];
    while(n--){
        key.push(obj[keys[n]]);
    }
    return key.join('|');
}
//去重操作
function uniqeByKeys(array,keys){
    var arr = [];
    var hash = {};
    for (var i = 0, j = array.length; i < j; i++) {
        var k = obj2key(array[i], keys);
        if (!(k in hash)) {
            hash[k] = true;
            arr .push(array[i]);
        }
    }
    return arr ;
}

//進行去重
var arr = uniqeByKeys(array,['a','b']);

假如需要按照屬性a,b為陣列進行去重

那麼最後將得到

array = [
    {a:1,b:2,c:3,d:4},
    {a:11,b:22,c:333,d:44},
    {a:111,b:222,c:333,d:444}
    ];