Создание нового массива из уникальных элементов, найденных в массиве

#javascript #arrays #unique #element

#javascript #массивы #уникальный #элемент

Вопрос:

Мне дали задание:

Поиск уникальных элементов в массиве и создание нового массива из этих уникальных элементов.

Профессор дал нам псевдокод для кодирования этого задания — оно должно быть простым, но мой код не работает.

Вот моя попытка:

 // search for unique birthdays in the array
function find(birthdays) {
  var uniqueBirthdays = [];
  for (var i = 1; i <= birthdays.length; i = i   2) {
    var count = 0;
    for (var j = 1; j <= birthdays.length; j = j   2) {
      if (birthdays[i] == birthdays[j]) {
        count  ;
      }
    }
    if (count == 1) {
      var n = uniqueBirthdays.length;
      uniqueBirthdays[n] = birthdays[i - 1];
    }
  }
  return uniqueBirthdays;
}
 

Я попытался проверить наличие ошибок отступа, а также ряд других вещей, но не могу понять, почему при обходе массива каждому элементу присваивается количество, равное только 1 (что означает, что совпадающих элементов нет) — похоже, что он не пересекает массив более одного раза, поэтому элементов нетимейте количество больше 1, хотя я использую вложенные циклы for .

Я увеличил интервалы на 2, потому что мне нужно сравнить все остальные элементы — каждому дню рождения присваивается номер, поэтому массив может выглядеть так:

 ['0001'][12/15]['0002'[03/12]...
 

Я совершенно новичок, поэтому, возможно, я упускаю из виду simple, но я перепробовал так много вещей, и я не могу понять, почему этот код не работает — он возвращает обратно все элементы, которые назначены дням рождения, а не только уникальным.

Я очень ценю любую помощь, которая укажет мне правильное направление.

Ответ №1:

Вы были очень близки, и было всего несколько ошибок. Единственное, что не сработало, это то, как вы написали свои for циклы:

 for (var i = 1; i <= birthdays.length; i = i   2) {
 
  • Индексы массива начинаются с 0 , поэтому, если вы хотите обработать первый элемент, используйте var i = 0;
  • Поскольку эти индексы начинаются с 0 , для массива 3 элементов последним индексом является 2 . Таким образом, вы хотите запускать свой цикл только тогда i , когда он меньше длины массива: i < birthdays.length
  • Вы пропускали элементы, выполняя i = i 2 . Кажется, для этого нет причин?

Что-то еще, о чем стоит упомянуть: в JS отступ не имеет значения — ну, это имеет значение, но только для того, чтобы ваши глаза не кровоточили. Фактически, большинство веб-сайтов используют уменьшенные версии своего кода, который умещается в одной (часто очень длинной и уродливой) строке (пример).

Вот ваш код, исправлены только две строки:

 function find(birthdays) {
  var uniqueBirthdays = [];
  for (var i = 0; i < birthdays.length; i = i   1) { // <-----
    var count = 0;
    for (var j = 0; j < birthdays.length; j = j   1) { // <-----
      if (birthdays[i] == birthdays[j]) {
        count  ;
      }
    }
    if (count == 1) {
      var n = uniqueBirthdays.length;
      uniqueBirthdays[n] = birthdays[i];
    }
  }
  return uniqueBirthdays;
}
// I used letters instead of birthdays for easier demo checking
var birthdays = ['a', 'b', 'a', 'c'];
console.log( find(birthdays) ); // ["b", "c"] 

Комментарии:

1. Blex- большое вам спасибо! Итак, первая половина урока была сосредоточена на псевдокоде, и теперь мы реализуем его в js — я ранее посещал класс на Python и не понимал, что отступы не имеют значения в js — цените информацию. Большое спасибо за вашу помощь.

Ответ №2:

В JS есть прямые методы tor, которые используют Array.indexOf(), Array.lastIndexOf() и Array.filter()

уникальные элементы имеют одинаковую первую позицию и последнюю позицию

пример кода:

 const initailArray = [...'ldfkjlqklnmbnmykdshgmkudqjshmjfhmsdjhmjh']

const uniqueLetters = initailArray.filter((c,i,a)=>a.indexOf(c)===a.lastIndexOf(c)).sort()

 
console.log(JSON.stringify(uniqueLetters))