12 methods of array deduplication

12 methods of array deduplication

Deduplication with ES6 Set (most commonly used in ES6)

  • SetThe object is a ES6newly defined data structure, similar to an array, which allows you to store any type of unique value, whether it is the original value or an object reference.
  • Array.from()The method is to convert an array-like object or traversable object into a real array
function unqiue(arr) {
    return Array.from(new Set(arr))
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unqiue(arr))
//1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}
  • Regardless of compatibility, this method of deduplication has the least code. This method cannot remove {}empty objects, and the later higher-order methods will add a method to remove the repeated "{}".

[…new Set(arr)]

  • The remaining parameter syntax allows us to represent an indefinite number of parameters as an array
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
var Arr = [...new Set(arr)]
console.log(Arr)
//1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}

Use for to nest for, and then splice to remove duplicates (most commonly used in ES5)

  • splice() The method can delete zero or more elements starting from the first parameter, and replace those deleted elements with one or more values ​​declared in the parameter list
function unique(arr) {
    for (var i = 0; i < arr.length; i++) {
        for (var j = i + 1; j < arr.length; j++) {
            if (arr[i] == arr[j]) {  //第一个等同于第二个,splice方法删除第二个
                arr.splice(j, 1);
                j--
            }
        }
    }
    return arr
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN,NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique(arr))
//[1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]     //NaN和{}没有去重,两个null直接消失了
  • Double-layer circulation, outer-layer circulation element, comparison value when inner-layer circulation. When the values ​​are the same, delete this value.

Use indexOf to deduplicate

  • indexOf() Method returns the first occurrence of a specified string value in the string
function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    var Arr = [];
    for (var i = 0; i < arr.length; i++) {
        if (Arr.indexOf(arr[i]) === -1) {
            Arr.push(arr[i])
        }
    }
    return Arr;
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN,NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique(arr))
// [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}]  //NaN、{}没有去重

Use sort ()

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return;
    }
    arr = arr.sort()
    var Arr = [arr[0]];
    for (var i = 1; i < arr.length; i++) {
        if (arr[i] !== arr[i - 1]) {
            Arr.push(arr[i]);
        }
    }
    return Arr;
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN,NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique(arr))
// [0, 1, 15, "NaN", NaN, NaN, {…}, {…}, "a", false, null, true, "true", undefined]      //NaN、{}没有去重

Use the properties of the object can not be the same characteristics for deduplication (this method of array deduplication has problems, it is not recommended, and needs to be improved)

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    var Arr = [];
    var obj = {};
    for (var i = 0; i < arr.length; i++) {
        if (!obj[arr[i]]) {
            Arr.push(arr[i])
            obj[arr[i]] = 1
            console.log(obj[arr[i]])
        } else {
            obj[arr[i]]++
            console.log(obj[arr[i]])
        }
    }
    return Arr;
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN,NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique(arr))
//[1, "true", 15, false, undefined, null, NaN, 0, "a", {…}]    //两个true直接去掉了,NaN和{}去重

Use includes

  • includes() The method is used to determine whether an array contains a specified value, if it returns true, otherwise false.
function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    var Arr = [];
    for (var i = 0; i < arr.length; i++) {
        if (!Arr.includes(arr[i])) {//includes 检测数组是否有某个值
            Arr.push(arr[i]);
        }
    }
    return Arr
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN,NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]     //{}没有去重

Use hasOwnProperty to determine whether there is an object property

  • ObjectThe hasOwnProperty()method returns a Boolean value to determine whether the object contains a specific self (non-inherited) attribute.
  • filter()Method to create a new array, the elements in the new array is to check all the elements in the specified array that meet the conditions
function unique(arr) {
    var obj = {};
    return arr.filter(function(item, index, arr){
        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
    })
}
    var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
        console.log(unique(arr))
    //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}]   //所有的都去重了

Use filter

  • indexOf()Method returns the first occurrence of a specified string value in the string
function unique(arr) {
  return arr.filter(function(item, index, arr) {
    //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
    return arr.indexOf(item, 0) === index;
  });
}
    var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr))
    //[1, "true", true, 15, false, undefined, null, "NaN", 0, "a", {…}, {…}]

Recursive deduplication

  • splice()The method can delete zero or more elements starting from the first parameter, and replace those deleted elements with one or more values ​​declared in the parameter list
function unique(arr) {
    var array = arr;
    var len = array.length;

    array.sort(function (a, b) {   //排序后更加方便去重
        return a - b;
    })

    function loop(index) {
        if (index >= 1) {
            if (array[index] === array[index - 1]) {
                array.splice(index, 1);
            }
            loop(index - 1);    //递归loop,然后数组去重
        }
    }
    loop(len - 1);
    return array;
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaNaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique(arr))
//[1, "true", false, null, 0, true, 15, NaN, NaN, "NaN", "a", {…}, {…}, undefined]

Deduplication using Map data structure

  • map()The method creates a new array, and the result is the result returned by each element in the array after calling a provided function.
function unique(arr) {
    let map = new Map();
    let array = new Array();  // 数组用于返回结果
    for (let i = 0; i < arr.length; i++) {
        if (map.has(arr[i])) {  // 如果有该key值
            map.set(arr[i], true);
        } else {
            map.set(arr[i], false);   // 如果没有该key值
            array.push(arr[i]);
        }
    }
    return array;
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaNNaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique(arr))
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
  • Create an empty Mapdata structure, traverse the array that needs to be deduplicated, and keystore each element of the array as Mapit. Since the Mapsame keyvalue will not appear in , the final result is the result after deduplication.

利用reduce+includes

  • reduce()The method receives a function as an accumulator, and each value in the array (from left to right) is reduced, and finally calculated as a value.
  • includes()The method is used to determine whether an array contains a specified value, if it is returned true, otherwise false.
function unique(arr) {
    return arr.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaNNaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique(arr));
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]

Guess you like

Origin www.cnblogs.com/landuo629/p/12748254.html