0

问题很奇怪:我通过拼接函数从数组(关联)中删除了一些元素,之后我添加了一些元素,突然出现了“欠精细”的元素。下面是日志(在“//”之后这是我对此的评论):

// adding first element; array length = 1
["asdasdasd"] microblog.js:48

// adding second element; array length = 2
["asdasdasd", "asdasdasd"] microblog.js:48 

// adding third element;  array length = 3
["asdasdasd", "asdasdasd", "asdasdasdqwe"] microblog.js:48 

// removing second element;  array length = 2
["asdasdasd", "asdasdasdqwe"] microblog.js:66 

// removing third element; array length = 1
["asdasdasdqwe"] microblog.js:66

// adding new element;  array length = 4
["asdasdasdqwe", undefined × 2, "asdasdqwrevcvxzvvxwfrqeqwewq"] 

这就是我添加元素的方式:

(...)
this.list[currId] = text;
(...)

这就是我删除元素的方式

(...)
this.list.splice(currId, 1);
(...)

如何避免这种未定义的元素?

4

2 回答 2

1

要么A ) -> 您正在使用当前元素来跟踪下一个添加到的位置,并且永远不会减少它:

var arr = []
for (var currId = 0; currId < 4; currId++) {
    arr[currId] = currID
}
//arr = [1, 2, 3, 4]
arr.splice(1, 3); // arr = [1]
// if currID is still 3
arr[currId] = "text"; // now arr = [1, undefined, undefined, "text"]

在这种情况下,当您删除项目以将它们添加到下一个位置时,您需要减少 currId。

B ) -> 只需使用Array.push()

var arr = []
for (var currId = 0; currId < 4; currId++) {
    arr.push(currId);
}
//arr = [1, 2, 3, 4]
arr.splice(1, 3); // arr = [1]
arr.push("text"); // now arr = [1, "text"]

B是一个更好的解决方案,如果只是将元素添加到数组的末尾是你想要的。

编辑:由于您想将“currID”保持为数组中放置项目的下一个位置,因此我假设无论何时执行此操作,

this.list[currId] = text;

你跟着它:

currId++;

如果这是正确的,那么相反的做法是在将对象从 Array 中拼接出来时减少它,例如:

var arr = [1, 2, 3, 4];
currId = 4 // The next position to add at is 4.
removeCount = 3;
arr.splice(1, removeCount); // arr = [1]
currId -= removeCount;

但坦率地说,这是一种糟糕的方法。请提供更多信息,以便我们帮助您找到更好的方法。

希望这可以帮助。

于 2012-06-22T15:18:15.760 回答
0

你是currId为了什么?

添加元素时(到最后),您应该这样做:

this.list.push(text)

或者

this.list[this.list.length] = text

并按索引修改元素。

于 2012-06-22T15:18:43.083 回答