2

配列からアイテムをスプライスしようとしている小さなコードがあります。以下のコードでは、「Javascript」を含むアイテムを削除し、結果の配列には「Java」のみを含める必要があります。私はここで何が間違っているのですか?

var autoCompleteArray = new Array();

var item = new Array();
item.push("1");
item.push("Java");
autoCompleteArray.push(item);

var item2 = new Array();
item2.push("2");
item2.push("Javascript");
autoCompleteArray.push(item2);


var val = "Javascript";

for(var i=0;i<autoCompleteArray.length;i++){

  if(autoCompleteArray[i][1] == val) {

    autoCompleteArray.splice(autoCompleteArray[i],1);

  }
}

console.log(autoCompleteArray);  //Should show Java in the array since Javascript item has been removed.
4

2 に答える 2

2

あなたは間違ったことをつなぎ合わせています。これはうまくいくはずです:

  if(autoCompleteArray[i][1] == val) {
    autoCompleteArray.splice(i,1);
  }

の最初の引数.splice()はインデックスであり、そのインデックスの値ではありません。

indexiでスプライスする場合、その反復では を増やしてはならないことに注意してiください。

var i = 0;
while (i < autoCompleteArray.length) {
  if(autoCompleteArray[i][1] == val) {
    autoCompleteArray.splice(i, 1);
    continue;
  }
  ++i;
}

もちろん、一致が 1 つしかない場合はこれで問題ありません。その場合break;、ループから抜け出すこともできます。

于 2013-03-12T04:00:49.880 に答える
1

@Jack が述べたように、インデックス (値ではない) を splice に渡す必要があります。ループを次のように書き直します。

for (var i = 0; i < autoCompleteArray.length; i++) {
    if (autoCompleteArray[i][1] === val) {
        autoCompleteArray.splice(i--, 1);
    }
}

それはあなたの問題を解決するはずです。ここでデモを参照してください: http://jsfiddle.net/7PM94/

また、要素をプッシュする代わりに、リテラル構文を使用して配列を作成できることにも注意してください。autoCompleteArray次のように定義できます。

var autoCompleteArray = [
    ["1", "Java"],
    ["2", "JavaScript"]
];

それが役立つことを願っています。

于 2013-03-12T04:06:24.340 に答える