Массив с уникальными значениями

189
19 апреля 2017, 13:05

Нужно написать функцию, что принимает массив и возвращает другой, с уникальными значениями;

которая также проверяет обьекты и массивы и сравнивает их;

например из объекта

[1,2,3,3,NaN,null,2,'str',''str',NaN,null, [1,2,3],[1,2,3],[3,1,2],{1:1},{1:1},{1:2}]  

на выходе получим

[1,2,3,NaN,nulln,[1,2,3],[3,1,2],{1:1},{1:2}]
function singleExemplar(array) {
    var unique = [...new Set(array)];//отсекаем повторяющейся простые значения
    далее, возможно, нужен перебор и детальное сравнивание обьктных типов, с удалением если сравнение оказалось положительное )
    return unique;
}
Answer 1

Добавляем отдельный массив, в который будем записывать хэши уже сохраненных элементов исходного массива. Новые элементы с таким же хэшем добавлять в результирующий массив не будем.
Хэш получаем с помощью JSON.stringify, но т.к. он вернет нам пустую строку для falsy-значений, то предварительно преобразуем значение в строку:

var arr = [1,2,3,3,NaN,null,false,false,undefined,2,undefined,'str','str',NaN,null, [1,2,3],[1,2,3],[3,1,2],{1:1},{1:1},{1:2}]; 
 
function u(arr) { 
  var unique=[], 
    hashes={}; 
   for(var i = 0; i < arr.length; i++) { 
    var currentHash = JSON.stringify(!!arr[i] ? arr[i] : ''+arr[i]); 
    if(!hashes[currentHash]){ 
      unique.push(arr[i]); 
      hashes[currentHash]=true; 
    } 
  } 
  return unique; 
} 
 
console.log(u(arr));

Но, как правильно заметили в комментарии, у JSON.stringify есть ограничения:

  • порядок свойств в объекте может не сохраняться, т.е. может оказаться, что JSON.stringify({a:1,b:2}) = '{"b":2,"a":1}'
  • мы "защищаем" хэши в исходном массиве, но во внутренних массивах/объектах JSON.stringify некоторые значения преобразует в null, что может привести к избыточному удалению элементов из исходного массива

Данных ограничений вполне достаточно, чтобы сказать, что данный метод не подходит для решения поставленной задачи, а потому не рекомендуется для использования.

READ ALSO
Запрос к платежному серверу

Запрос к платежному серверу

Могу ли я при помощи jQuery сделать запрос к платежному серверу Robokassa(authrobokassa

186
Как настроить vue в django?

Как настроить vue в django?

Пытаюсь настроить vue в djangoПрошерстил все что только возможно но нормального полноценного гайда не нашел

336
Axios-запрос не работает. Почему?

Axios-запрос не работает. Почему?

Проблема - axios-запрос не цепляется к серверуОшибка "Network Error"

245
Replace duplicate elements to &#39;default&#39;

Replace duplicate elements to 'default'

Необходимо написать jquery/js script, который бы при выставлении (в моем случае при выборе из селекта и нажатии на кнопку) двух одинаковых значений...

179