1.利用额外数组
function unique(array) { if (!Array.isArray(array)) return;
let newArray = []; for(let i=0, len=array.length; i<len; i++) { let itemAtIndex = array[i]; if (!newArray.includes(itemAtIndex)) { // newArray.indexOf(itemAtIndex) === -1 newArray.push(itemAtIndex); } }
return newArray;}
2.indexOf与lastIndexOf
function unique(array) { if (!Array.isArray(array)) return;
for(let i=0; i<array.length; i++) { let itemAtIndex = array[i]; if (array.indexOf(itemAtIndex) !== array.lastIndexOf(itemAtIndex)) { array.splice(i, 1); i--; // array 与 array.length change } }
return array; // 顺序可能会改变}
注: 利用额外数组配合indexOf与lastIndexOf 取出未重复出现的元素
function unique(array) { if (!Array.isArray(array)) return;
let newArray = []; for(let i=0, len=array.length; i<len; i++) { let itemAtIndex = array[i]; if (array.indexOf(itemAtIndex) === array.lastIndexOf(itemAtIndex)) { newArray.push(itemAtIndex); } }
return newArray;}
3.filter
function unique(arr) { return arr.filter(function(item, index, arr) { // 取出元素, 该元素在数组中第一次出现的索引 === 当前索引值 return arr.indexOf(item, 0) === index; });}
4.双层for循环
function unique(array) { if (!Array.isArray(array)) return;
for(var i=0; i<array.length; i++) {
for(var j=i+1; j<array.length; j++) { if (array[j] === array[i]) { array.splice(j, 1); j--; // array 与 array.length change } }
}
return array;}
5.利用sort排序后, 相邻元素不相等
function unique(array) { if(!Array.isArray(array)) return;
array.sort(); for (let i=0; i<array.length; i++) { if (i <= array.length-2) { if (array[i+1] === array[i]) { array.splice(i+1, 1); i--; // array 与 array.length change } } }
return array; // 顺序可能会改变}
6.利用对象key唯一的特性(这个方法还能标记出重复元素的数量); 另, map原理与object一致
function unique(array) { if (!Array.isArray(array)) return;
let obj = {}; for(let i=0, len=array.length; i<len; i++) { let itemAtIndex = array[i]; obj[itemAtIndex] = ‘‘; }
let newArray = []; for(let key in obj) { newArray.push(Number(key)); }
return newArray; // 顺序可能会改变}
7.利用ES6 set
function unique(array) { if (!Array.isArray(array)) return; return Array.from(new Set(array)); // [...new Set(array)] }
测试函数及测试用例
function ensureEqual(a, b, message) { if (JSON.stringify(a) !== JSON.stringify(b)) { console.log(`***测试失败, ${JSON.stringify(a)} 不等于 ${JSON.stringify(b)}, ${message}`); }};
ensureEqual(unique([1,2,3,3,4,4,5,5,6,1,9,3,25,4]), [1,2,3,4,5,6,9,25], ‘test1‘);
以上就是JavaScript数组去重的较为常规的方式;其中,第3种比较不容易想到;另,由于业务中一般处理的都是相同类型的数据,因此这里数组里的数据统一为数值类型,并未做混合类型的考虑。
原文地址:https://www.cnblogs.com/rencoo/p/11828329.html
时间: 2024-11-02 23:35:46