JS 陣列去重(陣列元素是物件的情況)
阿新 • • 發佈:2019-01-07
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}
];