16

我想要一个简单的值数组,即

var simpleArray = ["SE1","SE2","SE3"];

我想在发生动作时检查这个数组(点击谷歌地图图层),它将一个值传递给这个函数,然后将该值添加到数组中,或者如果它已经存在则从数组中删除它。

我现在看到 .splice/push/inArray/indexOf (在 IE 中不起作用)/grep (jQuery)有点困惑 - 不确定最佳实践是什么。

4

4 回答 4

32

假设项目的顺序无关紧要,您可以执行以下操作:

function toggleArrayItem(a, v) {
    var i = a.indexOf(v);
    if (i === -1)
        a.push(v);
    else
        a.splice(i,1);
}

从版本 9 开始,该.indexOf()方法在 IE 中有效,但如果您需要支持较旧的 IE 版本,您可以使用MDN中解释的 shim 。或者,如果您仍然使用 jQuery,请$.inArray()改用。

于 2013-09-12T13:19:14.007 回答
5

我的 ES* 变体

const toggleArrayValue = (arrayList, arrayValue) =>
  arrayList.includes(arrayValue)
    ? arrayList.filter(el => el !== arrayValue)
    : [...arrayList, arrayValue]
于 2020-01-16T11:55:52.080 回答
4

非常紧凑的 lodash 版本,使用xor 函数,用于创建仅在一个数组中而不是另一个数组中找到的新值数组

xor(array, [valueYouWantToToggle])
于 2020-09-01T17:09:39.767 回答
1

此外,如果该值是一个对象:

const eq = (a, b) => a == b

const toggle = (arr, item) => {
  const resultArray = [];
  let duplicate = false;
  for(let i = 0; i < arr.length; i++) {
    if(!eq(arr[i], item)) {
      resultArray.push(arr[i]);
    } else {
      duplicate = true
    }
  }
  if(!duplicate) {
    resultArray.push(item)
  }
  return resultArray;
}
于 2020-04-03T11:01:05.327 回答