即使存在重复项,也仅从 JS 数组中删除一项

Remove only 1 item from JS Array even if duplicates exist

我想我会分享这个以防人们需要它,因为我找不到类似的东西。

我想知道是否可以从数组中删除一个项目,即使该项目存在重复项。

让我们看一些代码:

var myArray = ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'd', 'd', 'e'],
    itemToRemove = 'a',
    itemToAdd = 'f';

对于上面的示例,我想从数组中删除 itemToRemove,但是,我不想删除所有的,只删除 1。然后我想添加 itemToAdd

为了提供一些背景信息,我正在构建一个基于 category/personality 的测验,每个问题的答案都有一个类别。我想将所有选择的类别存储在一个数组中,然后根据测验结束时最常见的类别显示结果。

问题是用户可以返回并根据需要更改他们的选择,因此如果他们改变主意,我需要删除之前的类别并添加新类别。

所以这个答案其实很简单。

var index = myArray.indexOf(itemToRemove);
if(index != -1) {
    array.splice(index, 1);
}

由于 indexOf 函数只找到第一个索引并且只找到 1 个索引,这可以用来删除数组中的一个项目。

我们还需要小心使用 indexOf,因为 IE8 不支持它,一如既往 IE8 很麻烦。

所以下面的代码可以让indexOf为你工作,必须运行才能使用这个功能。

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

来源: Why doesn't indexOf work on an array IE8?

如果有人有任何更好的方法来做到这一点,他们将不胜感激。