Как получить разницу двух строковых массивов? - PullRequest
2 голосов
/ 20 апреля 2019

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

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']

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

Ответы [ 3 ]

6 голосов
/ 20 апреля 2019

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

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.log(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.log(result);
1 голос
/ 20 апреля 2019

Вы можете удалить элементы из 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 будет вашим ожидаемым результатом в конце.

1 голос
/ 20 апреля 2019

Я думаю, что фильтр не является правильным apparoch здесь. Потому что есть некоторые элементы. Используйте простой цикл 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.log(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...