javascript splice的问题

时间:2013-03-12 03:52:16

标签: javascript

我有一小段代码,我正在尝试从数组中拼接一个项目。在下面的代码中,它应该删除具有“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.

2 个答案:

答案 0 :(得分:2)

你拼错了东西;这应该有效:

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

.splice()的第一个参数是索引,而不是该索引的值。

请注意,当您在索引i处拼接时,对于该迭代,您不应该增加i

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

如果当然只有一个匹配,这很好,在这种情况下你也可以break;离开循环。

答案 1 :(得分: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"]
];

希望有所帮助。