Я хочу получить точную разницу между двумя строковыми массивами.
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']
Я новичок, так что не могли бы вы направить меня в правильном направлении?
Должен быть пустой массив.
Почему? Какая логика стоит за этим?
У меня в основном есть массив символов слов (массив1). Если пользователь что-то вводит, символ добавляется в используемый массив символов. Пользователю разрешено вводить только символы в массиве1, и если они израсходованы, он больше не может их вводить. Поэтому мне нужен массив с разрешенными символами, который я использую для управления вводом.
Возможный дубликат получить разницу между двумя массивами (включая дубликаты)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, что фильтр здесь не подходит. Потому что некоторые элементы повторяются. Используйте простой цикл 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);Согласно (новым) спецификациям ОП, порядок не должен иметь значения.
Спасибо большое. Это займет некоторое время, чтобы переварить.
Вы можете удалить элементы из 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 теперь ты можешь :)
Какой результат для
["A", "B"] ["B", "A"]?