代码之家  ›  专栏  ›  技术社区  ›  I am the Most Stupid Person

Javascript数组作为更可读的数组

  •  1
  • I am the Most Stupid Person  · 技术社区  · 7 年前

    我有一个数据集,如下表所示。

    +------+---------+----+----+----+----+-------+----------+
    | Year | Subject | A  | B  | C  | F  | Total | PassRate |
    +------+---------+----+----+----+----+-------+----------+
    | 2015 | Maths   | 12 | 20 | 10 |  5 |    47 |       80 |
    | 2015 | Sinhala | 18 | 14 |  5 | 10 |    47 |       75 |
    | 2016 | Maths   | 25 | 15 |  4 |  8 |    52 |       25 |
    | 2016 | Sinhala | 20 | 12 |  2 | 18 |    52 |       60 |
    +------+---------+----+----+----+----+-------+----------+
    

    我想把这些数据存储在JavaScript数组中。所以我有以下代码。

    var firstArray = [];
    firstArray.push(['Year', 'Subject', 'A', 'B', 'C', 'F', 'Total', 'PassRate']); // headers
    firstArray.push([2015, 'Maths', 12, 20, 10, 5, 47, 80]); // 1st row
    firstArray.push([2015, 'Sinhala', 18, 14, 5, 10, 47, 75]) // 2nd row
    console.log(firstArray);

    如果我需要读多少 “B” ,是2015年的数学,我需要跑 firstArray[1][3] .

    那是不可读的。我是说很难找到它的意义 第一阵列[1][3] .

    那么有没有方法可以像 firstArray[2015]['maths'] 如果我想读多少 “B” 2015年数学

    3 回复  |  直到 7 年前
        1
  •  8
  •   CertainPerformance    7 年前

    听起来像是希望对象按年份索引,包含按主题索引的对象:

    const years = {
      '2015': {
        Maths: {
          A: 12, B: 20, C: 10, F: 5, Total: 47, PassRate: 80
        },
        Sinhala: {
          A: 18, B: 14, C: 5, F: 10, Total: 47, PassRate: 75
        },
      },
      '2016': {
        // ...
      }
    }
    console.log(years['2015'].Maths);
        2
  •  1
  •   Mario Santini Imran Kedim    7 年前

    您的目的是正确的,代码的可读性非常重要。

    这并不容易,也没有正确的路径可以遵循,但是我试着给你一些关于如何更改代码的提示。

    第一点:命名。

    这是非常困难的,通常甚至有经验的开发人员都需要重命名变量,因为它们无法在第一次获得正确的名称。

    你的变量是 第一阵列 当然,这个意义不大,你可以说它是一个数组,是第一个。。。

    不知道数组包含什么。

    一个更好的名字可能是 学生每年 .

    这个名字的改进之处在于它试图解决内容的含义。

    然后索引广告 神奇的数字 .

    当然,需要数字才能从数组中获取字段,如果在代码中使用适当的整数,那么要记住该字段是什么是非常复杂的。

    一种方法是避免在javascript纯对象中使用数组和散列映射。 所以你可以给每个字段起个名字。

    如果由于任何原因无法对数组进行abband,也可以在这里进行改进,只需使用常量来保存正确的索引:

     var MATHS = 1;
     var SCORE_OF_B = 3;
    
     var studentsScoreByYear= [
        ['Year', 'Subject', 'A', 'B', 'C', 'F', 'Total', 'PassRate'],
        [2015, 'Maths', 12, 20, 10, 5, 47, 80],
        [2015, 'Sinhala', 18, 14, 5, 10, 47, 75]
    ];
    
    console.log(studentsScoreByYear[MATHS][SCORE_OF_B]);
    

    当然还有其他办法,这只是一种可能性。

        3
  •  0
  •   Emil S. Jørgensen    7 年前

    对象列表是您希望以可读格式表示数据的内容。

    至于选择数据:

    var data = [
        { year: 2015, subject: 'Maths', a: 12, b: 20, c: 10, f: 5, total: 47, passrate: 80 },
        { year: 2015, subject: 'Sinhala', a: 18, b: 14, c: 5, f: 10, total: 47, passrate: 75 },
        { year: 2016, subject: 'Maths', a: 25, b: 15, c: 4, f: 8, total: 52, passrate: 25 },
        { year: 2016, subject: 'Sinhala', a: 20, b: 12, c: 2, f: 18, total: 52, passrate: 60 },
    ];
    console.log("Present All:");
    console.log(data
        .map(function (row) {
        return [row.year, row.subject, row.a, row.b, row.c, row.f, row.total, row.passrate].join(", ");
    })
        .join("\n"));
    console.log("Count `B` in `Maths` in 2015");
    console.log(data
        .filter(function (row) { return row.year === 2015 && row.subject === "Maths"; })
        .map(function (row) { return row.b; })
        .reduce(function (accumulator, currentValue) { return accumulator + currentValue; }, 0));

    旁注

    鹰眼在外面可能已经发现 map filter 在“全部呈现”示例中,调用是多余的,我可以简单地说:

    data.reduce(function (accumulator, row) { return accumulator + (row.year === 2015 && row.subject === "Maths" ? row.b : 0); }, 0);

    虽然上面的代码“更聪明”,但我认为使用 地图 滤波器 对于任何试图学习JavaScript数组处理和JavaScript对象的人来说都会有更大的用处。