#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))