我无法找到专门针对我所遇到的问题的问题,因此正在询问此问题。
我有一个包含5个数字的数组:
var numbers = [0,1,2,3,4];
在前端(网站)上点击一个数字后,使用以下代码从数组中删除该数字:
delete numbers[1];
这将删除正确的数字,但会留下数字所在的空格(空间未定义)。我相信这是一个问题。从数组中删除一个数字后,我使用另一个函数随机选择数组中的任何剩余数字,但它有时会失败。经过深思熟虑后,我意识到这可能是因为数字被移除后数组中有空格,因此,由于未定义的元素,代码无法工作。
我的比喻是正确的还是我错了?
(我还尝试使用splice方法删除数字然后导致数组长度出现问题,因为如果我以后想要删除另一个数字,则会因为数字移动而删除错误的数字等)。
答案 0 :(得分:1)
您要使用的是splice
在您的具体情况下,numbers.splice(1,1)
答案 1 :(得分:0)
如果你的意思是实际从数组中删除元素,让你的数组有4个元素,那么你可以使用
numbers.splice(1);
这将从数组中删除索引1中的元素,并返回新数组的部分。
答案 2 :(得分:0)
您确定delete
用undefined
替换数组中的一个值,并且不会更改数组长度。稍后,当您从数组中随机选择一个元素时,您最终可以获得该未定义的值,因为它仍占用数组中的一个插槽:
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的对象数组,您可能会更好,因此您可以根据需要引用特定数据担心保持数组索引相同。)