数组中的未定义元素是否会对JS产生影响?

时间:2018-03-07 23:59:51

标签: javascript arrays

我无法找到专门针对我所遇到的问题的问题,因此正在询问此问题。

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

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

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

delete numbers[1];

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

我的比喻是正确的还是我错了?

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

3 个答案:

答案 0 :(得分:1)

您要使用的是splice 在您的具体情况下,numbers.splice(1,1)

答案 1 :(得分:0)

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

numbers.splice(1);

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

答案 2 :(得分:0)

您确定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的对象数组,您可能会更好,因此您可以根据需要引用特定数据担心保持数组索引相同。)