1. 程式人生 > >5種方法實現數組去重

5種方法實現數組去重

RR 字符串 字符 ++ font i++ div sof n)

  1. 最簡單的思路,先創建一個新數組作為容器,遍歷原數組,判斷每一項在新數組中是否存在,若不存在則把這一項push到新數組中,若存在則忽略。
    var arr = [1, 2, 3, 2, 4, 1];
    var newArr = [];
    
    for (var i = 0; i < arr.length; i++) {
        if (newArr.indexOf(arr[i]) === -1) {
            newArr.push(arr[i]);
        }
    }
    
    console.log(newArr); // [1, 2, 3, 4]

  2. 直接修改原數組。遍歷原數組,使用indexOf判斷每一項,若返回值與自身的索引值不相等,說明同樣的值在前面已經出現過(因為indexOf返回的是第一個匹配項的索引值),使用splice()除去這一項。
    var arr = [1, 2, 3, 2, 4, 1];
    
    for (var i = 0; i < arr.length; i++) {
        if (arr.indexOf(arr[i]) !== i) {
            arr.splice(i,1);
        }
    }
    
    console.log(arr); // [1, 2, 3, 4]

  3. 利用對象的屬性名不能重復這一特性,創建一個對象,把數組中的值依次添加為對象的屬性,再使用Object.keys()得到包含所有屬性名的數組。但要註意對象的屬性名都是字符串形式,所以在本例中還要把它們轉回數字。
    var arr = [1, 2, 3, 2, 4, 1];
    
    var obj = {}; var res = []; arr.every(n => obj[n] = 1); // 把每一項添加為對象的屬性,重復的屬性不會再次添加,而是修改已存在的屬性的值 res = Object.keys(obj).map(n => +n); // 得到包含字符串屬性名的數組並把每一項轉換成數字 console.log(res); // [1, 2, 3, 4]

  4. 先對數組進行排序,再循環,如果相鄰的兩項相同,則刪除一項,i--,再繼續對比。
    var arr = [1, 2, 3, 2, 4, 1];
    arr.sort();
    
    for (var i = 0; i < arr.length; i++) {
        
    if (arr[i] === arr[i+1]) { arr.splice(i,1); i--; } } console.log(arr); // [1, 2, 3, 4]

  5. 最短的方法,使用new Set([...])。
    var arr = [1, 2, 3, 2, 4, 1];
    var newArr = new Set(arr);
    console.log(newArr);
    // [1, 2, 3, 4];

5種方法實現數組去重