Как получить разницу двух строковых массивов?

Я хочу получить точную разницу между двумя строковыми массивами.

const array1 = ['T','E','A','P','A','P','E','R'];
const array2 = ['T','A','P'];

Ожидаемый выходной массив:

['E','A','P','E','R']

Я пробовал этот метод:

const output = array1.filter(char => array2.includes(char));

Но это удаляет все экземпляры символа, например:

['E','E','R']

Я новичок, так что не могли бы вы направить меня в правильном направлении?

Какой результат для ["A", "B"] ["B", "A"] ?

Jonas Wilms 20.04.2019 15:16

Должен быть пустой массив.

Fallc 20.04.2019 15:19

Почему? Какая логика стоит за этим?

Jonas Wilms 20.04.2019 15:19

У меня в основном есть массив символов слов (массив1). Если пользователь что-то вводит, символ добавляется в используемый массив символов. Пользователю разрешено вводить только символы в массиве1, и если они израсходованы, он больше не может их вводить. Поэтому мне нужен массив с разрешенными символами, который я использую для управления вводом.

Fallc 20.04.2019 15:25
Поведение ключевого слова "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) для оценки ваших знаний,...
3
5
517
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, что фильтр здесь не подходит. Потому что некоторые элементы повторяются. Используйте простой цикл for. И удалите элементы, когда вы добавите их в результат.

const array1 = ['T','E','A','P','A','P','E','R'];
const array2 = ['T','A','P'];
const copy = [...array2];

let res = [];
for(let i = 0;i<array1.length;i++){
  let index = copy.indexOf(array1[i]);
  if (index === -1){
    res.push(array1[i]);
  }
  else copy.splice(index,1);
  

}
console.info(res)
Ответ принят как подходящий

Вы можете закрыть индекс для второго массива, увеличить индекс и удалить этот элемент из набора результатов.

var array1 = ['T', 'E', 'A', 'P', 'A', 'P', 'E', 'R'],
    array2 = ['T', 'A', 'P'],
    result = array1.filter((i => v => array2[i] !== v || !++i)(0));

console.info(result);

Другой подход без предопределенного порядка array2.

var array1 = ['T', 'E', 'A', 'P', 'A', 'P', 'E', 'R'],
    array2 = ['T', 'A', 'P'],
    set2 = new Set(array2)
    result = array1.filter(v => !set2.delete(v));

console.info(result);

Согласно (новым) спецификациям ОП, порядок не должен иметь значения.

Jonas Wilms 20.04.2019 15:27

Спасибо большое. Это займет некоторое время, чтобы переварить.

Fallc 20.04.2019 15:29

Вы можете удалить элементы из allowed на основе массива input:

 const allowed = ['T','E','A','P','A','P','E','R'];
 const input = ['T','A','P'];

 for(const char of input) {
   const pos = allowed.indexOf(char);
   if (pos === -1) {
     // char doesnt exist?
   } else {
     allowed.splice(pos, 1);
   }
 }

Тогда allowed будет вашим ожидаемым результатом в конце.

Спасибо! Я пытался проголосовать, но, к сожалению, не хватает некоторых баллов.

Fallc 20.04.2019 15:39

@fallc теперь ты можешь :)

Jonas Wilms 20.04.2019 15:42

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