Испытание "Уникальные элементы"

let numbers = [89,17,156,89,156,156,89,6,89,89,30];
let uniqueNumbers = [];
let uniqueNumberss = []
for(let i=0;i<numbers.length;i++){
let searchElements = numbers[i];
let indexes = [];
let index = numbers.indexOf(searchElements);
while ( index != -1 ) {
indexes.push( index );
index = numbers.indexOf(searchElements, index + 1 );

}
uniqueNumberss.push(numbers[i]);
if(indexes.length >=2){
delete uniqueNumberss[i];
}
}
uniqueNumbers = uniqueNumberss.filter(element=>element!== null);
Мой “Франкенштейн”

Мой вариант такой
let numbers = [1, 4, 5, 9, 2, 5, 1];
let uniqueNumbers = [];

for (let i = 0; i < numbers.length; i++) {
  let repeat = 0;
  for(let j = 0; j <numbers.length; j++) {
    if (numbers[i] === numbers[j] ) {
      repeat++;
    }
  }
  if (repeat <= 1) {
    uniqueNumbers.push(numbers[i]);
    }
}
console.log(uniqueNumbers);
1 лайк

let numbers = [1, 4, 5, 9, 2, 5, 1];
let uniqueNumbers = [];

let swap = [];
for (let i = 0; i < numbers.length; i++) {
for (let j = i + 1; j < numbers.length; j++) {
if (numbers[i] === numbers[j]) {
swap.push(numbers[i]);
}
}
}
console.log(swap)

for (i = 0; i < swap.length; i++) {
if (swap[i] === swap[i + 1]) {
swap.splice(i, 2);
i = 0;
};
}
console.log(swap);
console.log(numbers);
for (i = 0; i < numbers.length; i++) {
if (swap.indexOf(numbers[i]) < 0) {
uniqueNumbers.push(numbers[i]);
}
}
console.log(uniqueNumbers);

Долго думал как решить, в итоге решил создать функцию для наглядности, возвращающую true если значение уникально
Мое решение:

let numbers = [1, 4, 5, 9, 2, 5, 1];
let uniqueNumbers = [];


// Функция проверки на уникальность(возвращает булевое знач.)
let isUnique = function(parentArray, currentNumber) {
  let findedCounter = 0;
  for(j = 0; j < parentArray.length; j++) {
    if(parentArray[j] == currentNumber) {
      findedCounter++;
    }
  }
  if (findedCounter > 1) {
    return false;
  }
    return true;
}
//проход массива от начала до конца
for(i = 0; i < numbers.length; i++){
  if(isUnique(numbers, numbers[i])) {
    uniqueNumbers.push(numbers[i]);
  }
}

console.log(uniqueNumbers);
let numbers = [1, 4, 5, 9, 2, 5, 1];
let uniqueNumbers = [];
let tumbler = true;

for(let i = 0; i < numbers.length; i++) {
  
  for(let j = 0; j < numbers.length; j++) {
    if(numbers[i] === numbers[j] && j !== i) {
      tumbler = false;
    }
  }
  
  if(tumbler) {
    uniqueNumbers.push(numbers[i]);
  }
  
  tumbler = true;
}
Сделала задание с использованием методов для работы с массивами.

let numbers = [1, 4, 5, 9, 2, 5, 1];
let uniqueNumbers = [];

while (numbers.length > 0){ // цикл работает пока длина массива не нулевая
let currentNumber = numbers[0];
if (numbers.indexOf(currentNumber) != -1 ){ // убираем элемент из массива для простоты последующего сравнения
numbers.shift();
}
if (numbers.indexOf(currentNumber) == -1 ){ // если такого элемента в массиве больше нет, то записываем в массив уникальных элементов
uniqueNumbers.push(currentNumber);
}
else { // Иначе удаляем все повторяющиеся элементы из массива
while (numbers.indexOf(currentNumber) != -1 ){
numbers.splice(numbers.indexOf(currentNumber),1);
}
}
}

for (let i = 0; i < numbers.length; i++) {
  let number = numbers[i];
  let counter = 0;

  for (let j = 0; j < numbers.length; j++) {
    if (number === numbers[j]) {
     counter++;
    }
  }

  if (counter === 1) {
    uniqueNumbers.push(number);
  }
}
1 лайк

Спасибо за ваш вариант решения. Так же, понадобилось время, чтобы понять в чем суть. Спустя 3 года, но ваш комментарий помогает. Очень грамотное решение!

Мое решение

for (let i = 0; i < numbers.length; i++) {
  let count = 0;
  for (let j = 0; j < numbers.length; j++) {
    if (numbers[i] === numbers[j]) {
      count++
      }
    }
  if (count === 1) {
    uniqueNumbers.push(numbers[i]);
    }
  }

Решение с indexOf and lastIndex конечно интересное, но в курсе ничего не было про lastIndex

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

for (var i = 0; i < numbers.length; i++) {
var number = numbers[i];
var k = 0;
for (var j = 0; j < numbers.length; j++) {
if (number === numbers[j]) {
k ++;
}
}
if (k === 1) {
uniqueNumbers.push(number)
}
}

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

Спойлер
let numbers = [1, 4, 5, 9, 2, 5, 1];
let uniqueNumbers = [];
let noUniqueNumbers = [];

for (let prop of numbers) {
  if (!uniqueNumbers.includes(prop) && !noUniqueNumbers.includes(prop)) {
    uniqueNumbers.push(prop);
  } else if (uniqueNumbers.includes(prop)) {
    uniqueNumbers.splice(uniqueNumbers.indexOf(prop), 1);
    noUniqueNumbers.push(prop);
  }
}
let numbers = [1, 4, 5, 9, 2, 5, 1];
let uniqueNumbers = [];
let counter = 0; // кол-во совпадений


for (let j = 0; j < numbers.length; j++) {
     for(let i = 0; i < numbers.length; i++) {
         if (numbers[j] == numbers[i]) {
           counter++;
          };
      };
    
    if (counter == 1) { //Если 1 совпдаение, то добавляем его в массив
      uniqueNumbers.push(numbers[j]);
    }

counter = 0; // обнуляем счетчик
};

Здравствуйте, как вариант, сравнить первый и последний индекс элемента через IndexOf и lastIndexOf .

Спойлер

let numbers = [1, 4, 5, 9, 2, 5, 1];
let uniqueNumbers = [];

numbers.forEach((e, i) => numbers.indexOf(e) === numbers.lastIndexOf(e) ? uniqueNumbers.push(e) : ‘’);

Самое элегантное решение, что я видел)

let numbers = [1, 4, 5, 9, 2, 5, 1];
let uniqueNumbers = [];

for (let i = 0; i < numbers.length; i++) {
  let newArr = numbers.filter(number => number === numbers[i]);
  if (newArr.length === 1) {
    uniqueNumbers.push(numbers[i]);
  }
}

Отвечу для тех, кто когда то будет пытаться найти ответ на этот вопрос. Здесь два цикла, они будут перебирать следующим образом: i=0, перебирается второй цикл: j=0, j=1, j=2, … j=lenght, потом i=1, снова перебирается цикл: j=0, j=1, …j=lenght