Javascript数组作为更易读的数组

时间:2018-08-08 06:47:31

标签: javascript arrays object

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

+------+---------+----+----+----+----+-------+----------+
| 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);

如果我需要阅读2015年数学课程中的“ B” ,那么我需要运行firstArray[1][3]

那是不可读的。我的意思是很难找到firstArray[1][3]的含义。

如果我想阅读2015年数学版中的“ B” ,那么有没有办法像firstArray[2015]['maths']这样构建数组?

3 个答案:

答案 0 :(得分:8)

听起来像想要按年份索引的对象,其中包含按主题索引的对象:

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);

答案 1 :(得分:1)

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

这并不容易,也没有正确的路径,但是我尝试为您提供一些有关如何更改代码的提示。

第一点:命名。

这非常困难,而且即使是经验丰富的开发人员,也常常需要重命名变量,因为它们在第一时间无法获得正确的名称。

您的变量是 firstArray ,这当然没有什么意义,您可以说它是一个数组,它是第一个...

与数组包含的内容无关。

一个更好的名字可以是 studentsScoreByYear

此名称的改进之处在于它尝试解决内容的含义。

然后索引广告魔术数字

当然,您需要数字来从数组中获取字段,并且如果您仅在代码中使用适当的整数,则记住该字段是什么非常复杂。

一种方法是在javascript纯对象中避免使用数组并使用哈希映射。 因此,您可以为每个字段命名。

如果由于某种原因无法放弃数组,您也可以在这里进行改进,只需使用常量保存适当的索引即可:

 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]);

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

答案 2 :(得分:0)

对象列表是您想要以可读格式表示数据的对象。

关于选择数据:

  • 您可以使用数组上的filter方法来过滤数组。
  • 您可以使用数组上的map方法更改内容或隔离参数。
  • 您可以使用数组上的reduce方法执行算术运算。

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));

侧注

老鹰眼的人可能已经发现,“ {Present All””示例中的mapfilter调用是多余的,就像我可以简单地说的那样:

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

虽然上面的代码“更智能”,但我认为使用mapfilter进行更详细的回答对于尝试学习JavaScript数组处理和JavaScript对象的人来说会更有用。