【问题标题】:i not defined in while loop我没有在while循环中定义
【发布时间】:2017-11-22 23:13:34
【问题描述】:

我正在尝试添加匹配数组的所有数字并删除重复的名称。它适用于第一个实例,但 while 循环不会越过 Apples。

function updateInventory(arr1, arr2) {

   function alphabetizer(a, b) {
   if (a[1] < b[1]) return -1;
   if (a[1] > b[1]) return 1;
   return 0;
   }

  var newInv = arr1.concat(arr2).sort(alphabetizer);


  for(var i = 0; i < newInv.length; i++) {
    while(newInv[i][1] === newInv[i++][1]) {
      newInv[i] += newInv[i++][0];
      newInv.push([newInv[i][0], newInv[i][1]]);
      newInv.splice(i,2);


   }
  } 

    return newInv;
}

// Example inventory lists
var curInv = [
    [21, "Bowling Ball"],
    [2, "Dirty Sock"],
    [1, "Hair Pin"],
    [5, "Microphone"],
    [10, "Apples"]
];

var newInv = [
    [9, "Apples"],
    [2, "Hair Pin"],
    [3, "Half-Eaten Apple"],
    [67, "Bowling Ball"],
    [7, "Toothpaste"]
];

updateInventory(curInv, newInv);

它一直给我错误TypeError: newInv[(+ i)] is undefined 但我不知道为什么,因为我已经定义了,如果我只是尝试运行newInv[i],我会得到第一个结果。

JS Fiddle link

【问题讨论】:

  • 您通过执行i++ 在while 循环中将i 增加两次,您可能不想这样做。你可能想要i + 1
  • 当它告诉我i+1 没有定义。
  • 未定义的不是 i - 它是 newInv[i + 1] - 因为在循环结束时 i == netInv.length - 1 和 i + 1 (newInv[newInv.length])引用数组中不存在的索引...因此,未定义

标签: javascript for-loop multidimensional-array while-loop


【解决方案1】:

有几个地方需要修复。我更新了这个 jsfiddle

function updateInventory(arr1, arr2) {

    function alphabetizer(a, b) {
        if (a[1] < b[1]) return -1;
        if (a[1] > b[1]) return 1;

        return 0;    
    }

    var newInv = arr1.concat(arr2).sort(alphabetizer);

    for (var i = 0; i < newInv.length; i++) {
        var j = i;
        while (newInv[j + 1] && newInv[j][1] == newInv[j + 1][1]) {
            newInv[j][0] += newInv[j + 1][0];
            newInv.splice(j + 1, 1);
            j++;
        }
    }

    document.getElementById('test').innerHTML = newInv.join('<br>');
}

// Example inventory lists
var curInv = [
    [21, "Bowling Ball"],
    [2, "Dirty Sock"],
    [1, "Hair Pin"],
    [5, "Microphone"],
    [10, "Apples"]
];

var newInv = [
    [9, "Apples"],
    [2, "Hair Pin"],
    [3, "Half-Eaten Apple"],
    [67, "Bowling Ball"],
    [7, "Toothpaste"]
];

updateInventory(curInv, newInv);

https://jsfiddle.net/c3j8p2zu/7/

【讨论】:

  • 谢谢!你能解释一下为什么需要 j 吗?
  • 你在增加i和删除项目的同时,可以跳过数组中的一些项目,j用于记录旧的指针位置。旧代码中的主要问题是i++ 可能大于数组的长度,因此newInv[i++] 未定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 2012-05-22
  • 2016-01-12
  • 2017-01-05
  • 2019-10-11
  • 2012-10-20
相关资源
最近更新 更多