我有这个initialArray = [1,2,3,4,5,6]
我要添加此[1,2,3]
1 / 如果[1,2,3]
中存在initialArray
,我想将其从initialArray
中删除。
所以结果将是[4,5,6]
2 / 然后,我想再次添加[1,2,3]
,现在[1,2,3]
中不再存在initialArray
。
因此,在这种情况下,结果将为[4,5,6,1,2,3]
3 / 现在,我要添加[1,2,3,4,5,6]
。因此,在这种情况下,结果将为[]
我尝试使用.filter()
删除现有值,并且它可以工作。但是,如果值不存在,我将无法“ concat”。我无法同时做到两者。
我该怎么办?
答案 0 :(得分:1)
const initialArray = []; // your initial array
const add = []; // stuff you want to add
const { filtered, toAdd } = initialArray.reduce((acc, curr) => {
const index = acc.toAdd.findIndex(v => v === curr);
index === -1 ? acc.filtered.push(curr) : acc.toAdd.splice(index, 1);
return acc;
}, { filtered: [], toAdd: [...add] });
const final = [...filtered, ...toAdd];
如果您的initialArray有重复的值,您就可以做
const initialArray = [...new Set(initialArrayWithDuplicates)];
答案 1 :(得分:1)
您可以使用indexOf方法,因此它可能看起来像这样(为您提供一个基本示例):
var index = array.indexOf(item);
if (index !== -1) array.splice(index, 1);
也请考虑一下,下面的代码将正确地检查您尝试插入数组的值是否已经全部存在,因此将其删除:
for(var i = arrayWithNumbers.length - 1; i >= 0; i--) {
if(arrayWithNumbers[i] === number) {
arrayWithNumbers.splice(i, 1);
}
}
答案 2 :(得分:1)
您可以对数组进行迭代以添加和查找索引,然后推送值或拼接数组。
此解决方案会变异原始数组。
function add(target, source) {
source.forEach(v => {
var p = target.indexOf(v);
if (p === -1) {
target.push(v);
} else {
target.splice(p, 1);
}
});
return target;
}
var array = [1, 2, 3, 4, 5, 6];
add(array, [1, 2, 3]);
console.log(array); // [4, 5, 6]
add(array, [1, 2, 3]);
console.log(array); // [4, 5, 6, 1, 2, 3]
add(array, [1, 2, 3, 4, 5, 6]);
console.log(array); // []
答案 3 :(得分:1)
执行此操作的另一种方法是,将原始数组变异为:
const initialArray = [1,2,3,4,5,6];
const toggleElements = (array, change) =>
array.toString().includes(change)
? array.splice(array.indexOf(change[0]), change.length)
: array.push(...change);
toggleElements(initialArray, [1,2,3]);
console.log(initialArray);
toggleElements(initialArray, [1,2,3]);
console.log(initialArray);