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

Долго пытался решить эту задачу. Думал, что найду решение “поэлегантнее”. Ну, имею то, что имею. Т.к. на форуме нету темы на эту задачу, тогда я сам ее и создам. Код и скрин:
var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];
var secondNumbers = [];

for (var i = 0; i < numbers.length; i++) {
for (var j = i + 1; j < numbers.length; j++) {
if (numbers[i] === numbers[j]) {
secondNumbers.push(numbers[i]);
}
}
}
for (var i = 0; i < numbers.length; i++) {
for (var j = 0; j < secondNumbers.length; j++) {
if (numbers[i] === secondNumbers[j]) {
numbers.splice(i, 1);
i–;
}
}
}
for (var i = 0; i < numbers.length; i++) {
uniqueNumbers.push(numbers[i]);
}

Мой вариант:

  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)
      }
    }
21 лайк

У меня такой вариант, хотя continue вроде как не рекомендовали в курсах:

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

outer: for (var j = 0; j < numbers.length; j++) {
  for (var i = 0; i < numbers.length; i++) {
    if (numbers[j] === numbers[i] && i !== j) {
      continue outer;
    }   
  }
uniqueNumbers.push(numbers[j]);
}
1 лайк

при написание кода цель не писать коротко, а писать код понятный и выразительный для людей, легко читаемый и легко тестируемый. По этой причине continue лучше не использовать

2 лайка

Вот так вышло:

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

uniqueNumbers = numbers.filter((item) => numbers.indexOf(item) === numbers.lastIndexOf(item));
13 лайков

Мой вариант:

var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];
var numbersClone = numbers; //Клон массива, чтоб не портить оригинальный массив

// Проверка на наличие неуникальных значений. При появлении таковых присваиваем им значение ‘un’ в массиве-клоне

for (var i = 0; i < numbers.length; i++) {
for (var j = i + 1; j < numbers.length; j++) {
if (numbers[i] === numbers[j]) {
numbersClone[i] = ‘un’;
numbersClone[j] = ‘un’;
}
}

// Проверяем значения в массиве-клоне, и если они не равны ‘un’ - добавляем в массив уникальных номеров

if (numbers[i] != ‘un’) {
uniqueNumbers.push(numbers[i]);
}
}

console.log(uniqueNumbers);

5 лайков
Мой вариант
var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];
//Создаем массив для неуникальных ключей
var noUniqueNumbers = [];
for (var i = 0; i < numbers.length; i++) {
  //Первая проверка есть ли в нашем массиве дубли , вторая проверка есть ли в массиве noUniqueNumbers проверяемый ключ, если проверяемый ключ проверки проходит то добавляем его в uniqueNumbers , иначе если данного ключа нету в noUniqueNumbers   добавляем ключ в noUniqueNumbers( для красоты массива noUniqueNumbers , исключил повторения в нём ключей)
  if (numbers.indexOf(numbers[i],i + 1) < 0 && noUniqueNumbers.indexOf(numbers[i]) < 0 ) {
    uniqueNumbers.push(numbers[i]);
  } else if (noUniqueNumbers.indexOf(numbers[i]) < 0) {
    noUniqueNumbers.push(numbers[i]);
  }
}
console.log(uniqueNumbers);
console.log(noUniqueNumbers);

Рублено топором, есть идеи по оптимизации?

Уникальные элементы
var numbers = [12,12,15,7,1,15];
var uniqueNumbers = [];

for (var i=0; i<numbers.length; i++) //прогон всех элементов массива
    {var ifUnique = true; //факт уникальности элемента с номером i
     for (var j=0; j<numbers.length; j++) //прогон остальных элментов массива
        {if (numbers[i]===numbers[j] && i!==j) //если неуникален & не он же
              {ifUnique = false;
              }
         }
     if (ifUnique) {uniqueNumbers.push(numbers[i]);} //если ifUnique все еще тру - вписываем i
    }
12 лайков

var numbers = [4,1,2,3,4,0,7,5,6,7,0,0,1,8,2,9,0];
var repeatNumbers = [];
var uniqueNumbers = [];
var pass;
var repeat;

for (var i=0;i<numbers.length;i++){ // прогоняем элементы, на очереди i-тый, текущий
repeat = false; // флаг на найденное повторяющееся число
pass = false; // флаг на пропуск i-того повторяющегося элемента, который уже был
for (var j=0;j<repeatNumbers.length;j++){ // проверяем текущий элемент, нет ли его в массиве уже повторяющихся, встречавшихся ранее
if (numbers[i]==repeatNumbers[j]){
pass = true; // если он там есть хоть 1 раз то
break; // выходим из цикла и
}
}
if (!pass){ //пропускаем его сравнение, т.к. мы уже знаем что он неуникален, если же его там нет то
for (var j=i+1;j<numbers.length;j++){//прогоняем элементы от i+1
if (numbers[i]==numbers[j]){// если хотя бы 1 следующий элемент равен i-тому, то (он ведь повторился)
repeat=true; // присваеваем флагу repeat=true
break; // и выходим из цикла
}
}
if (!repeat){ // если текущий элемент не повторялся дальше по массиву(repeat=false)
uniqueNumbers.push(numbers[i]); // значит он уникален
}else{ // если же повторялся то
repeatNumbers.push(numbers[i]); // заносим его в массив повторяющихся
}
}
}
console.log(uniqueNumbers);

1 лайк
var numbers = [4,1,2,3,4,0,7,5,6,7,0,0,1,8,2,9,0];
var repeatNumbers = [];
var uniqueNumbers = [];
var pass;
var repeat;


for (var i=0;i<numbers.length;i++){ // прогоняем элементы, на очереди i-тый, текущий
  repeat = false; // флаг на найденное повторяющееся число
  pass = false; // флаг на пропуск i-того повторяющегося элемента, который уже был
  for (var j=0;j<repeatNumbers.length;j++){ // проверяем текущий элемент, нет ли его в массиве уже повторяющихся, встречавшихся ранее
    if (numbers[i]==repeatNumbers[j]){ 
      pass = true; // если он там есть хоть 1 раз то
      break; // выходим из цикла и
    }
  }
  if (!pass){ //пропускаем его сравнение, т.к. мы уже знаем что он неуникален, если же его там нет то
    for (var j=i+1;j<numbers.length;j++){//прогоняем элементы от i+1
      if (numbers[i]==numbers[j]){// если хотя бы 1 следующий элемент равен i-тому, то (он ведь повторился)
        repeat=true; // присваеваем флагу repeat=true
        break; // и выходим из цикла
      }
    }
    if (!repeat){ // если текущий элемент не повторялся дальше по массиву(repeat=false)
      uniqueNumbers.push(numbers[i]); // значит он уникален
    }else{ // если же повторялся то 
      repeatNumbers.push(numbers[i]); // заносим его в массив повторяющихся
    }
  }
}
console.log(uniqueNumbers);

Почему топором?
На мой взгляд самое лаконичное и изящное решение, особенно по сравнению со всеми предложенными тут))

У меня также получилось:

for (var i = 0; i <= numbers.length - 1; i ++) {
  var check = true;
  for (var j = 0; j <= numbers.length - 1; j ++) {
      if (numbers[j] == numbers[i] && j != i) {
      check = false;
    } 
  }
      if (check) {
      uniqueNumbers.push(numbers[i]);
    } 
}
7 лайков

Если отталкиваться только от той информации, которая доносилась в главе этого курса и практикума к нему, то мне кажется, что решение ниже будет наиболее оптимальным. Поправьте, если не прав.

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

for (var i = 0; i < numbers.length; i++) {
  if (numbers.indexOf(numbers[i]) === numbers.lastIndexOf(numbers[i])) {
    uniqueNumbers.push(numbers[i]);
  }
}
21 лайк
Уникальные элементы
var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];


for (var i = 0; i < numbers.length; i++) {  // перебираем массив;
  var temp = numbers[i];  // записываем текущий элемент в переменную;
  var idx = numbers.indexOf(temp);  // записываем индекс текущего элемента в переменную;
  var tempArray = [];  // создаем временный массив для хранения индексов;
  
  while (idx != -1) {  // перебираем массив до конца;
  tempArray.push(idx);  // записываем индекс во временный массив;
  idx = numbers.indexOf(temp, idx + 1);  // проверяем, дублируется ли элемент далее в массиве;
  }
  
  if (tempArray.length === 1) {  // если во временный массив попал только один индекс,
    uniqueNumbers.push(temp);  // значит элемент по данному индексу уникален, записываем его;
  }
}

Классное задание. Заставило так изрядно подумать.

пол дня сидел, разные решения искал, больше всего это понравилось, самое короткое:

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


for (var i = 0; i < numbers.length; i++) {
   var check = true;
  for (var c = 0; c < numbers.length; c++) {
    if (numbers[i] == numbers[c] && i !== c) {
       var check = false;
    } 
  }
  if (check) {  
        uniqueNumbers.push(numbers[i]);
  }    
}
4 лайка

Решение похожее на то, что выше.

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

for (var i = 0; i < numbers.length; i++) {
  var uniq = 1;
  for (var j = 0; j < numbers.length; j++) {
    if (i === j) {
      continue;
    }
    if (numbers[i] === numbers[j]) {
      uniq = 0;
    }
  }
  if (uniq) {
    uniqueNumbers.push(numbers[i]);
  }
}
Сводка
var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];

for (var i = 0; i< numbers.length; i++){
    var index = 0;
    for (var j = 0; j <numbers.length; j++ ) {
        if (numbers[i] == numbers[j]) {
            index ++;  
        }
    }
    if (index < 2){
        uniqueNumbers.push(numbers[i]); 
    }  
}
2 лайка

Всем привет!
Вот, что получилось у меня:

var numbers = [101,15,116,20,116,15,2];
var uniqueNumbers = [];

for (var i = 0; i < numbers.length; i++) {
  var index = numbers [i];
  
  for (var j = 0; j < numbers.length; j++) {
     if (numbers[j] === index && j != i) {
     var repeat = numbers[j]  
     }     
  }
  if (index !== repeat) {
    uniqueNumbers.push(index);     
  }     
}

Может кому нибудь пригодиться. искал более лаконичное решение, но пока что так
var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];
var freqCounter; //переменная частоты встречи какого либо числа

for (var i=0; i < numbers.length; i++){
  freqCounter = 1;
  for (var j=0; j < numbers.length; j++){
    /*проверка является ли проверяемое число из массива им самим же, так как*/
/*внутренний цикл проходится по все элементов от начала до конца, ищя повторения*/
    if (j === i){ continue; } 
//если число натыкается на самого себе(с тем же индексом),
//то происходит пропуск итерации цикла
    if (numbers[i] === numbers[j]){ freqCounter++; }
  }
  /* если число встретилось только раз, оно вводится в массив уникальных значений */
  if (freqCounter === 1){uniqueNumbers.push(numbers[i]);}
}

ну ваше решение такое же как у предыдущих, только вместо булева флага вы “придумали” счетчик. и наплодили переменных.
а самое лаконичное все еще у Digna