Почему повторяющиеся элементы возвращают undefined?

 const cardChild = document.querySelectorAll('.card i');
 const cardsArray = ['a','a','b','b','c','c']; 
 const matchArray = [];

function cardsToClass() {
     for (i = 0; i < cardChild.length; i++) {

         let newCard = cardsArray.pop();
         let newCardClass = cardChild[i];
         matchArray.push(cardsArray[i]);

         newCardClass.className += newCard;
         console.info(cardsArray);
     }; }

Привет! Эта функция использует .pop () для «выталкивания» элементов cardArray как класса в элементе DOM. Моим окончательным результатом должны быть два идентичных массива (cardArray и matchArray). Я уже близко. Однако, когда я console.info matchArray, он возвращает:

 ['a','b','c',undefined,undefined,undefined]

Я думаю, что что-то происходит в

 matchArray.push(cardsArray[i]);

но не уверен. Кто-нибудь знает, почему он не возвращает повторяющиеся элементы?

Спасибо!

Хотите, чтобы cardArray был ['a','b','c']?

Gerardo BLANCO 11.07.2018 19:54

Вы можете добавить свой html?

Gerardo BLANCO 11.07.2018 19:56

Я пытаюсь сделать matchArray ['a', 'b', 'c', 'a', 'b', 'c'], как и cardsArray. Однако последний 'a' 'b' 'c' оказывается неопределенным

ab3d_work 11.07.2018 19:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
22
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это происходит потому, что .pop фактически изменяет исходный массив.

См. документация


Поскольку .pop модифицирует cardsArray, массив фактически сжимается по мере продвижения цикла.

Для каждой итерации цикла cardsArray начинается как:

  1. cardsArray = ['a','b','c','a','b','c'];
  2. cardsArray = ['a','b','c','a','b'];
  3. cardsArray = ['a','b','c','a'];
  4. cardsArray = ['a','b','c'];
  5. cardsArray = ['a','b'];
  6. cardsArray = ['a'];

Из этого ясно, что из третьей итерации (i = 2) на cardsArray[i] стоит undefined.

хммм ..... ты прав. Мне нужно будет в конечном итоге сравнить карты и сопоставить массив. Я попробую клонировать "новый" массив карточек и "вытолкнуть" старый.

ab3d_work 11.07.2018 20:02
Ответ принят как подходящий

Вы копируете массив с первой позиции до последней. Но, добавляя pop(), вы также удаляете последний элемент каждый раз, когда используете pop, потому что половина значений не определена.

Замените pop на unshift(), это решит вашу проблему.

Я действительно не понимаю цели кода, но HTML может помочь, если вы добавите его.

Надеюсь, это поможет:>

//const cardChild = document.querySelectorAll('.card i');
 const cardsArray = ['a','a','b','b','c','c']; 
 const matchArray = [];

function cardsToClass() {
     for (i = 0; i < cardsArray.length; i++) {

         let newCard = cardsArray.unshift();
         //let newCardClass = cardChild[i];
         matchArray.push(cardsArray[i]);

         //newCardClass.className += newCard;

     };
console.info(cardsArray);
console.info(matchArray);
}
     
cardsToClass() 

Ты прав! благодарю вас! Это дает мне дубликат массива, который мне нужен. Однако без .pop () он не «выталкивает» эти элементы в DOM. Я должен разобраться с этим. Спасибо, что направили меня в правильное русло!

ab3d_work 11.07.2018 20:31

Другие вопросы по теме