js 群中有人问数组如何去重,激发一阵热烈讨论。
如果是在 powershell 中,那就简单了,直接调用 get-unique 方法即可。
在 js 中,又如何来处理数组去重呢?
下面谈谈我对此问题的理解。
---------------------------------------------
一种思路是利用数组的 indexOf 方法(用 lastindexOf 应该也可以),此方法会检测传入 indexOf 方法中的值,是否在数组中出现过,如未找到,是返回值 -1 ,由此来判断。
var arr = [0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1]; var arr1 = ["red", "green", "blue", "red", "purple", "maroon", "green", "yellow", "blue","red"]; //利用数组的indexOf方法 function getUnique(arr) { //用数组字面量声明一个空数组,将作为去重后的结果返回 var result = []; //利用for遍历传入的测试数组,检测数组中的每个值是否已出现在结果数组中 //返回 -1 ,则表明无,随即调用数组的 push 方法把此值压入结果数组中 for (var i = 0; i < arr.length; i += 1) { if (result.indexOf(arr[i]) == -1) { result.push(arr[i]); } } return result; } alert(getUnique(arr)); alert(getUnique(arr1));
---------------------
另一思路,则是利用对象特性辅助去重
//借助 js 对象特性为辅助去重 function getUniquer1(arr) { //用数组字面量声明一个空数组,将作为去重后的结果返回 var result = []; //用对象字面量声明一个空对象,作为辅助判断当前数组值是否为重复 var aux = {}; for (var i = 0; i < arr.length; i += 1) { if (!aux[arr[i]]) { //最关键!判断对象中名为 arr[i] 的属性值是否为 false! result.push(arr[i]); //调用push方法,把值压入结果数组中 aux[arr[i]] = 1; //重要!给对象中名为 arr[i]的属性赋值! } } return result; } alert(getUniquer1(arr)); alert(getUniquer1(arr1));
--------------------------------------------------------华丽的分割线--------------------------------------------
两种思路,高下立判:
前者调用 indexOf 方法,每次均需遍历整个数组,设想下,数组中有 10000 项,所耗费时间之大,不可想象。