#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)