开发者问题收集

如何计算所有嵌套数组中的元素数量

2021-06-01
2032

我最近开始学习 JavaScript,遇到了一个问题。
我编写了一小段代码来计算嵌套数组中的元素,但在向第一个嵌套数组添加元素时,代码会中断。我不明白问题出在哪里。

var clothes = [
    ['cap', 'scarf'],                 //-- When adding a new element, the counter breaks
    ['T-shirt', 'shirt', 'trousers'], //-- When adding a new item, the counter works fine
    ['boots', 'sneakers']             //-- When adding a new item, the counter works fine
];

var totalItems = function () {
    for (var i = 0; i < clothes.length; i++) {
        var total = 0;
        for (var k = 0; k <= clothes[i].length; k++) {
            total = total + clothes[k].length;
        }
        return total
    }
};

console.log('all clothes: ' + totalItems());

错误:

Uncaught TypeError: Cannot read property 'length' of undefined
at totalItems (test2.js:13)
at test2.js:31

请帮忙解释一下为什么只有在向第一个嵌套数组添加元素时才会出现错误?

3个回答

您有几个问题。您的 for 循环需要检查 < clothes.length ,因为 <= 将检查数组中没有的额外值(数组以 0 为基数,array.length 以 1 为基数)。您还每次通过 for 循环重新分配总数,并且在完成循环后从 for 循环返回。您的内部循环每次还会不断增加总数的值,从而创建会急剧增长的数字。

此修改将以更简洁的方式解决所有这些问题。

var totalItems = function () {
    var total = 0;
    for (var i = 0; i < clothes.length; i++) {
        total += clothes[i].length;
    }
    return total;
};

ES6 方式:

let totalItems = () => {
    let total = 0;
    clothes.forEach(entry => total += entry.length);
    return total;
}
Mordred
2021-06-01
var totalItems = function () {
    for (var i = 0; i <= clothes.length; i++) {
        var total = 0;
        for (var k = 0; k < clothes[i].length; k++) {
            total = total + clothes[k].length;
        }
        return total
    }
};

只需像这样编辑您的代码。似乎您的第二个条件正在寻找不存在的索引。

Deniz Firat
2021-06-01

您可以使用迭代器,每次函数在嵌套数组中找到新值时,迭代器都会加 1 ( iterator++ )。在下面的示例中,我使用嵌套在另一个 forEach 循环中的 forEach

var clothes = [
  ['cap', 'scarf', 'hat'], //-- Added a new element no breaky
  ['T-shirt', 'shirt', 'trousers'], //-- When adding a new item, the counter works fine
  ['boots', 'sneakers'] //-- When adding a new item, the counter works fine
];

var totalItems = function() {
  let total = 0 //<-- iterator
  clothes.forEach(items => {
    items.forEach((item) => {
      total++ // iterate by one each time around
    })
  })  
  return total
}

console.log('all clothes: ' + totalItems());
dale landry
2021-06-01