【问题标题】:JavaScript dictionary value incrementing not working in nested for loopJavaScript字典值递增在嵌套for循环中不起作用
【发布时间】:2021-07-05 19:13:09
【问题描述】:

我正在使用 d3.js 读取 csv shark.csv,但我遇到了嵌套 for 循环的问题。 csv 包含按大陆和年份划分的有关鲨鱼袭击的数据。所以我想存储每个大陆每年出现的次数。这是shark.csv的截图:

这就是我希望结果的样子:

(这些是随机数)

我将每个大陆名称在特定年份中显示的次数存储在字典中,并按如下方式递增:

var allYears = [];

var allConti = [];

var allOccur = {};

d3.csv("https://raw.githubusercontent.com/eliasdon/proj/main/shark.csv").then(function(data) {

    // get all unique years
    for (var i = 0; i < data.length; ++i) {
        if (!allYears.includes(data[i].Date)) {
            allYears.push(data[i].Date);
        }
    }

    // get all unique Continents
    for (var i = 0; i < data.length; ++i) {
        if (!allConti.includes(data[i].Continent)) {
            allConti.push(data[i].Continent);
        }
    }

    for (var i = 0; i < data.length; ++i) {

        for (var j = 0; j < allYears.length; ++j) {

            for (var k = 0; k < allConti.length; ++k) {

                // if key for match between year and continent is not stored yet
                if (!(allYears[j] + " " + allConti[k] in allOccur)) {

                    //store it with value of 1
                    allOccur[allYears[j] + " " + allConti[k]] = 1;
                } else {

                    //if already stored increment it
                    allOccur[allYears[j] + " " + allConti[k]] = ++allOccur[allYears[j] + " " + allConti[k]];
                }
            }
        }
    }
    console.log(allOccur);
});

这基本上就是代码的作用:

1- 读取 csv

2- 存储所有独特的年份

3- 存储所有独特的大陆

4- 如果没有名为allYears[j] + " " + allConti[k](年份和大陆)的键,则添加它并赋予其值 1。

5- 如果它已经存在,则将其值增加 1

问题是所有年份和大陆键的值都是 csv 中的总行数

我的 for 循环有什么问题?

【问题讨论】:

    标签: javascript csv dictionary for-loop d3.js


    【解决方案1】:

    您在第三次外部 for 循环 var i = 0; i &lt; data.length; ++i 的每次迭代中递增字典中的所有值。相反,您应该只增加与当前数据迭代相对应的值。

    旁注,a = ++a 是多余的。您要么想要a = a + 1a++/++aa++ 是最常见的变量递增方式。

    更多旁注:

    • 更喜欢let 而不是var
    • 更喜欢i++ 而不是++i
    • 首选'而不是";更好的是,更喜欢模板字符串 ${a} ${b} 而不是字符串连接 a + ' ' + b
    • 为键分配一个局部变量,而不是重复计算 3 次
    • 更喜欢 [].forEach 而不是传统的 for 循环
    • 更喜欢if (a[key]) 而不是if (key in a)
    let allYears = [];
    let allConti = [];
    let allOccur = {};
    
    d3.csv("https://raw.githubusercontent.com/eliasdon/proj/main/shark.csv").then(data => {
        allYears = [...new Set(data.map(d => d.Date))];
        allConti = [...new Set(data.map(d => d.Continent))];
    
        data.forEach(d => {
            let key = `${d.Date} ${d.Continent}`
            allOccur[key] = allOccur[key] || 0;
            allOccur[key]++;
        });
    
        console.log(allOccur);
    });
    

    【讨论】:

    • 美丽的作品。感谢您指出其他小东西。非常感谢! @junvar
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2020-04-08
    相关资源
    最近更新 更多