Добавьте значение из массива в другой массив, если оно не существует, и отфильтруйте его из массива, если оно существует

#javascript #arrays

#javascript #массивы

Вопрос:

У меня есть:

 const currentState = ['Godwin', 'Hadrada', 'Timujin', 'LaGrandBatard']
const selection = ['Atila', 'Godwin']
  

Каков наилучший способ удалить значение из первого массива, если оно уже содержит одно из значений из массива выбора и добавить к нему значение, если оно еще не содержит одно из значений?

Просто чтобы было более понятно, конечный результат должен быть:

 newArray = ['Hadrada', 'Timujin', 'LaGrandBatard', 'Atila']
  

Комментарии:

1. Что вы пробовали? StackOverflow не является бесплатным сервисом кодирования. Попробуйте решить проблему самостоятельно, прежде чем обращаться за помощью.

2. Совет: Array.prototype.indexOf

3. w3schools.com/js/js_array_methods.asp

4. А бесплатная поддержка кодирования?! это адская программа, я могу отправить ее на Луну и обратно с ней! Я пробовал циклы filter и for и includes, но ничего не подходит

5. Что вы подразумеваете под «удалить значение из первого массива, если оно уже содержит его» (что такое «это»). Можете ли вы быть более конкретным и добавить желаемый результат для массива 2, который вы опубликовали в качестве примера?

Ответ №1:

Существует много возможных решений этой проблемы. Вот одно из них, использующее reduce indexOf :

 const currentState = ['Godwin', 'Hadrada', 'Timujin', 'LaGrandBatard'];
const selection = ['Atila', 'Godwin'];

const newState = selection.reduce((a, s) => {
  var i = a.indexOf(s);
  if (i === -1) {
    a.push(s);
  } else {
    a.splice(i, 1);
  }
  
  return a;
}, [...currentState]);

console.log(...newState);  

Чтобы изменить коллекцию на месте, просто используйте currentState вместо [...currentState]

Вот другое, более краткое решение с reduce и Set :

 const currentState = ['Godwin', 'Hadrada', 'Timujin', 'LaGrandBatard'];
const selection = ['Atila', 'Godwin'];

const newState = Array.from(selection.reduce(
  (a, s) => (a.has(s) ? a.delete(s) : a.add(s), a),
  new Set(currentState)));

console.log(...newState);  

Ответ №2:

 const currentState = ['Godwin', 'Hadrada', 'Timujin', 'LaGrandBatard']
const selection = ['Atila', 'Godwin']

let foo = {}
currentState.forEach(bar => {
  foo[bar] = true
})
selection.forEach(bar => {
  if (foo[bar]) {
    delete foo[bar]
  } else {
    foo[bar] = true
  }
})
const results = Object.keys(foo)

console.log(results)