如何仅在不存在数组时才将值附加到数组,否则将其删除?

时间:2018-12-14 11:47:52

标签: javascript arrays

我有这个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”。我无法同时做到两者

我该怎么办?

4 个答案:

答案 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);