数组中未定义的元素对 JS 有影响吗?



我找不到专门针对我遇到的问题的问题,因此提出了这个问题。

我有一个包含 5 个数字的数组:

var numbers = [0,1,2,3,4];

在前端(网站)上单击数字后,使用以下代码从数组中删除该数字:

delete numbers[1];

这将删除正确的数字,但在数字所在的位置留下一个空格(空格未定义)。我相信这导致了一个问题。从数组中删除一个数字后,我使用另一个函数随机选择数组中剩余的任何数字,但有时会失败。经过深思熟虑,我意识到这可能是因为在删除数字后数组中有空格,因此,由于未定义的元素,代码无法工作。

我的类比是正确的还是我弄错了?

(我还尝试使用 splice 方法来删除数字,但这会导致我的数组长度出现问题,因为如果我以后想删除另一个数字,它会由于数字移动等而删除错误的数字)。

你想用的是splice在您的具体情况中,numbers.splice(1,1)

您是正确的,deleteundefined替换数组中的一个值,并且不会更改数组长度。 稍后,当您从数组中随机选择一个元素时,您最终可能会得到该未定义的值,因为它仍然占用数组中的一个插槽:

var numbers = [0,1,2,3,4];
delete numbers[3];
console.log(numbers)

改用splice,它将从数组中完全删除该项:

var numbers = [0,1,2,3,4];
numbers.splice(3,1) /// remove one element starting at index 3
console.log(numbers)

如果我以后想删除另一个数字,由于数字四处移动,它会删除错误的数字

您确实需要选择一种行为或另一种行为。如果您需要按原样保留索引,请继续使用delete,将未定义的值保留在数组中,并重写"随机选择一个"函数以永不选择未定义的值:

// start with some undefined values:
var numbers = [0, 1, undefined, undefined, undefined, 5]
var pickRandom = function(numbers) {
// make a copy of the array, removing undefined elements:
var definedValues = numbers.filter(function(item) {
return item !== undefined;
});
if (definedValues.length === 0) {return false}
//choose one at random:
return definedValues[Math.floor(Math.random() * definedValues.length)]
}
// test it:
console.log(pickRandom(numbers));
console.log(pickRandom(numbers));
console.log(pickRandom(numbers));
console.log(pickRandom(numbers));

(...但请注意,这表明在这里使用简单的数组是错误的数据结构;最好使用一个对象数组,每个对象都有一个显式 ID,因此您可以根据需要引用特定的对象,而不必担心保持数组索引相同。

如果您的意思是实际从数组中删除元素,让您的数组包含 4 个元素,那么您可以使用

numbers.splice(1);

这将从数组中删除索引 1 中的元素,并返回新数组的部分。

最新更新