1

我正在尝试从数组中拼接一些已定义值的所有实例。

    filterfunc: function(anyArray){
      for(var i = 0; i <anyArray.length; i++){
        var v = anyArray[i];
          for(var j = 1; j <arguments.length; j++){
           if(v == arguments[j]){
              anyArray.splice(i,1);
            }
          }
        } 
          return anyArray;
      },

我传递了一个数组以及我不想要的参数。

我遇到的问题是拼接函数并没有拼接值的所有实例。

例如: filterfunc([1,2,2,2,3,3,3,4,5,6],2,3); 结果:[1,2,3,3,4,5,6]

我希望它返回 [1,4,5,6]

4

8 回答 8

4

我不擅长 JavaScript,但删除数组项会减小它们的大小,在这种情况下最好以倒序循环。

for(var i = anyArray.length-1; i>0; i--){
   var v = anyArray[i];
   for(var j = 1; j <arguments.length; j++){
      if(v == arguments[j]){
         anyArray.splice(i,1);
      }
   }
}
于 2013-03-03T20:21:04.357 回答
2

我会改为发送第二个数组,例如:filterfunc([1,2,2,2,3,3,3,4,5,6],[2,3])并使用Array.prototype.filter()

function filterfunc(a, b) {
  return a.filter(function(x) { return b.indexOf(x) == -1; });
}
于 2017-03-11T07:16:22.963 回答
1

拼接后添加 i-- 否则字符串会缩短,然后您将错过要考虑的值:

http://jsfiddle.net/6HatJ/1/

function filterfunc(anyArray){
  for(var i = 0; i <anyArray.length; i++){
    var v = anyArray[i];
      for(var j = 1; j <arguments.length; j++){
       if(v == arguments[j]){
          anyArray.splice(i,1);
           i--;
        }
      }
    } 
      return anyArray;
  };
于 2013-03-03T19:59:32.760 回答
0

一个while循环怎么样。

function removeInstanceOfElement(elem, arr)
{
    var index = 0;

    while(index < arr.length)
    {
        if(arr[index] == elem)
        {
            arr.splice(index, 1);
            index = 0;
        }
        else
        {
            ++index;
        }
    }

    return arr;
}
于 2013-12-06T19:45:59.960 回答
0

Underscore包含许多有用的辅助函数,而uniq可能正是您正在寻找的。

如果您只想要该功能而不是整个库,您只需查看源代码即可。

于 2013-03-03T20:00:02.740 回答
0

让我们使用 forEach,同时观察 splice 是一个就地函数。返回数组只是为我们提供了一个我们已经拥有的引用:

function remove(arr,elements) {
  elements.forEach(function(e) {
    for(var i=arr.length-1; i>=0; i--) {
      if(arr[i]==e) { arr.splice(i,1); }
    }
  });
}

// test
var a = [1,2,3,3,3,3,4,5,5,6,7,7],
    b  = [3,5,7];
remove(a,b);
a;
于 2013-03-03T20:06:36.657 回答
0

anyArray.splice(...) 更改数组中元素的数量,从而更改现有元素的索引。每次删除元素时都应将索引减一

anyArray.splice(i--,1);
于 2013-03-03T20:03:36.807 回答
0

您可以使用 reduce 通过拼接来遍历数组。这是一个使用带有 reduce 的拼接的简单示例

假设我们有一个数组 a 并且想要删除所有 'd' 的实例

a = ['a', 'b', 'd', 'c', 'd'];
a.reduce((prevValReturned, currVal, currIndex, array) =>{
  if (currVal == 'd') a.splice(currIndex, 1);
}, 0);

在控制台中查看数组 a 你会看到它现在是

["a", "b", "c"]

然而 splice 在每次调用时都是 n 阶,移动所有连续的元素。如果使用非常大的数据集可能会更好地循环并使用推送

a = ['a', 'b', 'd', 'c', 'd'];
b= []
a.reduce((prevValReturned, currVal, currIndex, array) =>{
  if (currVal != 'd') b.push(currVal);
}, 0)

当然,这不会改变数组 a。在您看到的控制台中查看数组 b

["a", "b", "c"]
于 2016-11-11T12:34:55.880 回答