Удалить уникальный элемент из массива [дубликат]

130
11 мая 2018, 11:34

На данный вопрос уже ответили:

  • Удаление уникальных элементов из массива 2 ответа

Всем привет такая проблемма, не могу понять где ошибка в моём коде.

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

function nonUniqueElements(array) { 
 
    var new_array = []; 
//    var count = 0; 
 
    for (var i = 0; i < array.length; i++) { 
        for (var j = 0; j < array.length; j++) 
            if (array[i] !== array[j]) { 
                array.splice(array[i], 1); 
                return array; 
            } 
 
    } 
 
    return array; 
} 
 
console.log(nonUniqueElements([1, 2, 3, 1, 3])); 
console.log(nonUniqueElements([1, 2, 3, 4, 5])); 
console.log(nonUniqueElements([5, 5, 5, 5, 5])); 
console.log(nonUniqueElements([10, 9, 10, 10, 9, 8]));

Если посмотреть в консоль то 1 и 3 -й варианты получаются правильно, но остальные нет.

Answer 1

Всё немного сложнее чем кажется, вы допустили много ошибок, во первых у вас удаляется один элемент, после которого цикл завершается возвратом массива, во вторых вы удаляете элемент с неправильной позиции используя значение array[i], вместо i, также при удалении элемента из массива, нужно учитывать, что индексы сдвигаются, поэтому необходимо вернуть индекс на один назад.

Вот решение, если текущий элемент единственный, то он удаляется:

function nonUniqueElements(array) { 
 
    for (var i = 0; i < array.length; i++) { 
       if(array.filter(item => item == array[i]).length == 1){ 
          array.splice(i, 1); 
          --i; 
       } 
    } 
 
    return array; 
} 
 
console.log(nonUniqueElements([1, 2, 3, 1, 3])); 
console.log(nonUniqueElements([1, 2, 3, 4, 5])); 
console.log(nonUniqueElements([5, 5, 5, 5, 5])); 
console.log(nonUniqueElements([10, 9, 10, 10, 9, 8]));

Answer 2

function nonUniqueElements(array) { 
  var counts = {}; 
  array.forEach(item => counts[item]? counts[item]++ : counts[item] = 1); 
  return array.filter(item => counts[item] > 1); 
} 
 
console.log(nonUniqueElements([1, 2, 3, 1, 3])); 
console.log(nonUniqueElements([1, 2, 3, 4, 5])); 
console.log(nonUniqueElements([5, 5, 5, 5, 5])); 
console.log(nonUniqueElements([10, 9, 10, 10, 9, 8]));

Answer 3

function nonUniqueElements(array) { 
  return array.filter((el, i, arr) => arr.indexOf(el) != arr.lastIndexOf(el)); 
} 
 
console.log(nonUniqueElements([1, 2, 3, 1, 3])); 
console.log(nonUniqueElements([1, 2, 3, 4, 5])); 
console.log(nonUniqueElements([5, 5, 5, 5, 5])); 
console.log(nonUniqueElements([10, 9, 10, 10, 9, 8]));

READ ALSO
Как убрать маркеры у путевых точек? (яндекс map api)

Как убрать маркеры у путевых точек? (яндекс map api)

У меня есть 2 путевые точки и некоторое количество транзитных точекЭти точки формируют маршрут

116
Js: Загрузка картинок в окно

Js: Загрузка картинок в окно

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

108
создать окно выезжающее сбоку и висящее [требует правки]

создать окно выезжающее сбоку и висящее [требует правки]

Это окно сделано на основе JampPanel на JavaScript http://forummybb

137
Как вывести картинки с записи вк [требует правки]

Как вывести картинки с записи вк [требует правки]

Как вывести картинки с какой нибудь одной записи вк?

141