Шесть способов дедупликации массива

JavaScript

Дедупликация массива — это относительно простая проблема, с которой можно столкнуться на собеседованиях и в работе.В обзоре базовых знаний в эти дни я также обобщил общие методы и поделился ими с вами. Если у вас есть какие-либо другие методы, пожалуйста, прокомментируйте и обсудите вместе. Если есть что-то, что выражено не так, пожалуйста, поправьте меня.

001. Используйте двойнойforцикл

Чтобы сравнить каждое значение в массиве, мы можем использовать двойной цикл for, например пузырьковую сортировку. Также можно использовать двойной цикл for для дедупликации массива.

function unique(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = i+1; j < arr.length; j++) {
      if (arr[i] == arr[j]) {
        arr.splice(j,1)
        j--
      }
    }
  }
  return arr
}
let arr = [1,1,'true','true', 'a', 'a',true,true,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0,{},{},[],[]];
console.log(unique(arr)) // [ 1, 'true', 'a', false, undefined, NaN, NaN, 'NaN', {}, {} ]

может видетьNaNне снято, два{}не удалили, потому что{}является эталонным значением, но мы используемarr[i] == arr[j]Происходит преобразование типов, поэтомуtrue:

  • 1 == true
  • false== []
  • undefined == null
  • false == 0

Для решения вышеуказанной проблемы мы можем использоватьObject.is(arr[i], arr[j])метод заменыarr[i]==arr[j]можно удалитьNaNТакже предотвращает преобразование типов. Код здесь не выложен, вы можете написать и запустить его самостоятельно.

Примечание. Для удобства следующего arr здесь используется значение arr.

2. ИспользуйтеindexOf()

использоватьindexOf(), можно судить о том, содержит ли массив определенное значение, если оно существует, вернуть позицию элемента в массиве, если не существует, вернуть-1.

functon unique(arr) {
    let res = []
  	for (let i = 0; i < arr.length; i++) {
        if (res.indexOf(arr[i]) === -1) {
          	res.push(arr[i])
        }
  	}
  	return res
}
console.log(unique(arr)) //[ 1,   'true',   'a',   true,   false,   undefined,   null,   NaN,   NaN,   'NaN',   0,   {},   {}, [], []]

Здесь мы создаем новый массив для хранения дедуплицированного массива.Если массив не содержит элементов, мы добавим элементpushВ массиве можно обнаружить, что этот метод до сих пор не удаленNaN、{}、[].

3. Используйтеincludes()

использоватьincludes()Метод также может определять, содержит ли массив определенный элемент, и возвращать значение, если он есть.trueвернуть, если не включеноfalse. с участиемindexOf()Метод несколько похож, поэтому мы используемincludes()Выполнение дедупликации и суммирования массиваindexOf()Принцип метода тот же.

functon unique(arr) {
    let res = []
    for (let i = 0; i < arr.length; i++) {
        if (!res.includes(arr[i])) {
      	    res.push(arr[i])
        }
    }
    return res
}

4. Используйтеfilter()

filter()Метод создает новый массив с элементами нового массива, проверяя все элементы в указанном массиве, которые соответствуют условиям. а такжеfilter()не меняет массив,такжеПустые массивы не проверяются.filter()Способ получает функцию обратного вызова.

грамматика:

array.filter(function(item,index,arr), thisValue)
параметр описывать
item должен. значение текущего элемента
index Необязательный. значение индекса текущего элемента
arr Необязательный. Объект массива, которому принадлежит текущий элемент

Код

function unique(arr) {
    return arr.filter((item,index, arr) => {
        return arr.indexOf(item) === index
    })
}
console.log(unique(arr)) //[ 1, 'true', 'a', true, false, undefined, null, 'NaN', 0, {}, {}, [], [] ]

Здесь мы используем суждениеindexOf(item)Определить, что индекс текущего элемента равен текущемуindex, если равно, вернуть элемент.

Пять, характеристики объекта использования

Объект — это структура, которая хранит информацию в парах ключ-значение и не может иметь повторяющихся ключей.

function unique(arr) {
  let obj = {}
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] in obj) {
      obj[arr[i]] ++
    } else {
      obj[arr[i]] = 10
    }
  }
  return Object.keys(obj) // 以数组的形式返回键
}
console.log(unique(arr)) // [ '0',   '1',   'true',   'a',   'false',   'undefined',   'null',   'NaN',   '[object Object]',   '']

Написать этот метод немного проблематично, потому что он используетсяObject.keys(obj)чтобы вернуть набор ключей, поэтому все, что вы получаете, находится в виде строк.

6. Используйте набор

ES6Предоставляет новые структуры данныхSet. Он похож на массив, но все значения членов уникальны и нет повторяющихся значений.

function unique(arr) {
  return [...new Set(arr)]
}
console.log(unique(arr)) //[ 1,   'true',   'a',   true,   false,   undefined,   null,   NaN,   'NaN',   0,   {},   {},   [],   [] ]

ЭтоES6Самый распространенный метод, результаты неплохие.

Семь, уменьшите Дафа

function unique(arr) {
    return arr.reduce((pre, cur) => {
        !pre.includes(cur) && pre.push(cur)
        return pre
    }, [])
}


Спасибо за прочтение. Я надеюсь, что вы также можете поделиться своими часто используемыми методами общения друг с другом.