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 に答える
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

Underscoreには便利なヘルパー関数がたくさん含まれており、uniqはまさにあなたが探しているものかもしれません。

ライブラリ全体ではなく、その関数だけが必要な場合は、ソースコードを確認するだけです。

于 2013-03-03T20:00:02.740 に答える
0

anyArray.splice(...) は配列内の要素の数を変更するため、既存の要素のインデックスが変更されます。要素を削除するたびに、インデックスを 1 ずつ減らす必要があります

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

reduce を使用して、スプライスを使用して配列を通過できます。これは、reduce で splice を使用した簡単な例です。

配列 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"]

ただし、スプライスは各呼び出しで次数 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 に答える
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

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 に答える