我有一个如下表所示的数据集。
+------+---------+----+----+----+----+-------+----------+
| 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']
这样构建数组?
答案 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)
对象列表是您想要以可读格式表示数据的对象。
关于选择数据:
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””示例中的map
和filter
调用是多余的,就像我可以简单地说的那样:
data.reduce(function (accumulator, row) {
return accumulator + (row.year === 2015 && row.subject === "Maths" ? row.b : 0);
}, 0);
虽然上面的代码“更智能”,但我认为使用map
和filter
进行更详细的回答对于尝试学习JavaScript数组处理和JavaScript对象的人来说会更有用。