7

私は2つの配列を持っていavailable_itemsますrequested_items. requested_itemsにない要素を削除したいavailable_itemsforEach要素が削除され、次の要素が古いインデックスを持つ場合でも内部インデックスが増加するため、を使用しても期待される結果が明らかに得られません。

これがテストケースです(これも jsbinにあります):

var available_items = [2, 5, 9, 36, 48, 23];
var requested_items = [5, 12, 49, 30, 90, 17];
requested_items.forEach(function(v, i, a) {
  if(available_items.indexOf(v) == -1) {
    console.log("will remove " + i + ' ' + v);
    a.splice(i, 1);
  } else console.log("will keep " + i + ' ' + v);
});
console.log('Resulting request array is ' + requested_items.toString());

結果は次のとおりです。

"will keep 0 5"
"will remove 1 12"
"will remove 2 30"
"will remove 3 17"
"Resulting request array is 5,49,90"

これは何万回も繰り返されるため、ライブラリ (アンダースコアなど) の使用は、パフォーマンスに悪影響を与える場合は避けたいものです。

それで、私の質問は、これを修正するための最も安価な方法は何ですか?

4

2 に答える 2

12

for ループを使用して逆方向にカウントするため、インデックスに問題はありません。

for(var i = requested_items.length - 1; i >= 0; i--) {
   // your logic
}

ハッキーに「感じ」ますが、うまくいきます。

于 2013-07-25T08:11:57.210 に答える