JavaScript

Проблема с решением задачи (циклы)

Мне нужно из этого массива [1, 4, 5, 9, 2, 5, 1] вывести в консоль все неповторяющиеся значения - [4, 9, 2]. Я пытаюсь сделать это при помощи двух циклов.

var numbers = [1, 4, 5, 9, 2, 5, 1];

for (var i = 0; i <= numbers.length - 1; i++) {
for (var j = 0; j <= numbers.length - 1 && j != i; j++) {
if (numbers[i] != numbers[j]) {
console.log(numbers[i]);
}
}
}

Я ожидаю, что первый цикл будет по очереди сравнивать числа (i) с числами (j) из второго цикла. И я рассчитывал на 7 итераций:
1) i = 0 | j = 1; j = 2; j = 3; j = 4; j = 5; j = 6 | - в консоль не выведется
2) i = 1 | j = 0; j = 2; j = 3; j = 4; j = 5; j = 6 | - console.log(4)
3) i = 2 | j = 0; j = 1; j = 3; j = 4; j = 5; j = 6 | - в консоль не выведется
4) i = 3 | j = 0; j = 1; j = 2; j = 4; j = 5; j = 6 | - console.log(9)
5) i = 4 | j = 0; j = 1; j = 2; j = 3; j = 5; j = 6 | - console.log(2)
6) i = 5 | j = 0; j = 1; j = 2; j = 3; j = 4; j = 6 | - в консоль не выведется
7) i = 6 | j = 0; j = 1; j = 2; j = 3; j = 4; j = 5 | - в консоль не выведется

Но вместо этого получается другой результат (на скриншоте). Помогите, пожалуйста, мне разобраться, что здесь не так (если возможно, то как можно проще).
Я бы так сделал:
let map = {}, i;
for (i = 0; i < a.length; i++) {
if (!map[ a[i] ]) {
console.log( a[i] );
map[ a[i] ] = 1;
}
}

Это тратит больше памяти чем ваш вариант, но должно работать быстрее.
Данил Смирнов
Данил Смирнов
33 003
Лучший ответ
Как раз недавно выкладывал свой вариант решения вложенным циклом
var a = [5,8,4,3,9,5,1,6,3,5,2,8,7,4,5,3,0,5,6,6];
console.log(a);
var b = [];
for (var i = 0; i < a.length; i++) {
for (var j = 0; j < a.length; j++) {
if (i == j) {
continue;
}
if (a[i]==a[j]) {
b.push(a[i]);
var n = a[i];
}
for (var k = 0; k < a.length; k++) {
if (a[k] == n) {
a.splice(k, 1);
}
};
};
};
console.log('не повторяются ' + a);
console.log('повторяются ' + b);
____
5,8,4,3,9,5,1,6,3,5,2,8,7,4,5,3,0,5,6,6
не повторяются 9,1,2,7,0
повторяются 5,8,3,6,4
Кирилл Соколов
Кирилл Соколов
53 433
Перед первым (внешним циклом) отсортируйте массив numbers.sort()
Больше, вроде, ничего можно не менять.
В сортированном массиве можно обойтись одним циклом.
Ну, или хорошее решение Ламзин Андрей предложил, ясное и простое.
МО
Мша Олексюк
96 259
Не так вы представляете циклы... оно просто берет и кругами выполняет то, что написано внутри.

var numbers = [1, 4, 5, 9, 2, 5, 1];

for (var i = 0; i < numbers.length; i++) {
  for (var j = 0; j < numbers.length && j != i; j++) {
    if (numbers[i] != numbers[j]) {
      console.log(numbers[i]);
    }
  }
}

Запускается код для i = 0;

Внутри которого начинается новый цикл, который кругами выводит числа в консоль и не срабатывает только на j == i, т. е. 0.

numbers[i] внутри этого цикла пока всегда будет == 1

А оставшиеся элементы массива выведутся по очереди: 4, 5, 9, 2, 5

Не выводится только последняя единичка, т. к. numbers[j] == numbers[i] == 1

Запускается следующий круг для i = 1.

И очереднй цикл j - от нуля до .length и т. д... оттуда и дофига результатов.

Цикл можно прервать через ключевое слово break; но он тут не поможет.
______________

Можно решить так - https://jsfiddle.net/OPTlMUS/1pkcdqxs/ , из массива собрать строку и через регулярку проверить - сколько раз в нем попадается очередной эелемнт. А если совпадение всего одно - уникальный элемент, добавить в новый массив.
Nurbol Lamasharipov
Nurbol Lamasharipov
62 360
Ошибка в том, что число выводится сразу, как только встретит непохожее на себя
А надо в случае нахождения пропустить это число и вывести только тогда, когда проверены все варианты (и не налось пересечения)