空插槽如何出现在数组中?



我对javascript很陌生,我无法找出undefined对象在什么时候插入到我的数组中:

function foo(arrA){
  if(!arrA || arrA[0] === 0)
       return undefined;
  let arrB = [];
  let prevEntry = 1;
  for(let i=0; i < arrA.length; i++) {
      if (2*prevEntry == arrA[i]) {
          prevEntry *= 2;
          arrB[i] = (Math.pow(arrA[i], 2)).toString();
      }
  }
  return arrB;
}
foo([2,4,6,8,9,15,16,27]);

作为输出,正如预期的那样,我得到了一个幂为 2 的数组,但它与undefined对象交错,我只是不明白为什么。

(7) ["4", "16", undefined × 1, "64", undefined × 2, "256"]

提前感谢您的帮助! :-(

你可能想推送:

for(let i=0; i <arrA.length; i++){
  if (2*prevEntry == arrA[i]){
    prevEntry *= 2;
    arrB.push((Math.pow(arrA[i], 2)).toString());
  }
}

当您将元素添加到特定索引处的数组时,每个以前未定义的索引都将使用未定义的值进行初始化。

例如,当您有

var array = [];
array[3] = 1

控制台日志将提供输出

[undefined, undefined, undefined, 1]

所以解决方案是,正如 Jonas 所写,简单地将元素推送到数组中,而不是将它们插入特定索引处。

由于这一行2*prevEntry == arrA[i],您的代码跳过了arrA中的一些索引,并且由于arrAarrB的索引相同,因此arrB没有值,即未定义。不要按索引arrB插入平方,而是使用 push() ,这只会插入平方数。

function foo(arrA){
  if(!arrA || arrA[0]===0)
    return undefined;
  let arrB =[];
  let prevEntry = 1;
  for(let i=0; i <arrA.length; i++){
    if (2*prevEntry == arrA[i]){
      prevEntry *= 2;
      arrB.push(Math.pow(arrA[i], 2)).toString();
    }
  }
  return arrB;
}
console.log(foo([2,4,6,8,9,15,16,27]));

最新更新