我有一个包含一些数据的对象。第一个维度从1-12开始,代表一年中的几个月。在那之内,我有一些ID" true"那个月:
var monthData = {
1: { 219: true, 474: true },
2: { 219: true, 391: true },
3: { 219: true },
...
};
要使用此数据,我会搜索month
(值1-12),然后搜索该月内的ID
(例如391)。如果该月内有ID
,那么我return true;
return !!monthData[month][ID];
然而,当查看我的完整数据时,似乎有很多重复。我每个月都会重复219: true
。我也在每个ID之后重复true
- 真正只有ID
的存在才真实,所以我觉得这可以改进。
我可以将其存储为数组数据吗?有没有一种简单的方法来迭代这个并按我的意愿返回数据?
以下全部功能:
findIDByMonth : function (month,ID) {
var monthData = {
1: { 219: true, 474: true },
2: { 219: true, 474: true },
3: { 219: true, 474: true },
4: { 219: true, 296: true, 391: true, 474: true, 578: true, 917: true, 987: true, 1036: true },
5: { 219: true, 296: true, 391: true, 474: true, 578: true, 917: true, 987: true, 1036: true },
6: { 219: true, 391: true, 474: true, 578: true, 834: true, 917: true, 987: true, 1036: true },
7: { 219: true, 251: true, 391: true, 474: true, 578: true, 834: true, 917: true, 987: true, 1036: true },
8: { 219: true, 251: true, 391: true, 474: true, 526: true, 578: true, 834: true, 917: true, 987: true, 1036: true, 1092: true },
9: { 219: true, 251: true, 296: true, 391: true, 474: true, 526: true, 578: true, 897: true, 917: true, 987: true, 1036: true, 1092: true },
10: { 219: true, 251: true, 391: true, 474: true, 526: true, 578: true, 897: true, 917: true, 987: true, 1036: true, 1092: true },
11: { 219: true, 474: true, 987: true, 1036: true },
12: { 219: true, 474: true }
};
return !!monthData[month][ID];
}
答案 0 :(得分:1)
你可以在你的功能中加入这样的东西。我认为如你所提到的那样,数组可能是可读性的好选择。我保持你的外部对象不受影响,因为它似乎不需要更改为数组,因为它不会减少你的代码长度,并且你选择哪个月更清楚。
var monthData = {
1: [219, 474],
2: [219, 391],
...
};
return !!monthData[month].includes(ID);
答案 1 :(得分:0)
您可以将所有数据存储为数组数组,然后使用indexOf()
搜索数据。
function findIDByMonth(month,ID) {
var monthData = [
[219, 474],
[219, 474],
[219, 474],
[219, 296, 391, 474, 578, 917, 987, 1036],
[219, 296, 391, 474, 578, 917, 987, 1036],
[219, 391, 474, 578, 834, 917, 987, 1036],
[219, 251, 391, 474, 578, 834, 917, 987, 1036],
[219, 251, 391, 474, 526, 578, 834, 917, 987, 1036, 1092],
[219, 251, 296, 391, 474, 526, 578, 897, 917, 987, 1036, 1092],
[219, 251, 391, 474, 526, 578, 897, 917, 987, 1036, 1092],
[219, 474, 987, 1036],
[219, 474]];
return monthData[month - 1].indexOf(ID) !== -1;
}
至于几个月内ID的重复,除非它是静态数据,否则你无能为力。
答案 2 :(得分:0)
findIDByMonth : function (month,ID) {
var monthData = [
[ 219, 474 ],
[ 219, 474 ],
[ 219, 474 ],
[ 219, 296, 391, 474, 578, 917, 987, 1036 ],
[ 219, 296, 391, 474, 578, 917, 987, 1036 ],
[ 219, 391, 474, 578, 834, 917, 987, 1036 ],
[ 219, 251, 391, 474, 578, 834, 917, 987, 1036 ],
[ 219, 251, 391, 474, 526, 578, 834, 917, 987, 1036, 1092 ],
[ 219, 251, 296, 391, 474, 526, 578, 897, 917, 987, 1036, 1092 ],
[ 219, 251, 391, 474, 526, 578, 897, 917, 987, 1036, 1092 ],
[ 219, 474, 987, 1036 ],
[ 219, 474 ]
];
return monthData[month-1].includes(ID);
}
答案 3 :(得分:0)
当您说要将数据存储为数组时,您所寻找的内容并不十分清楚。
如果你想完全展平你的数据,你可以用month-id
形式创建一个字符串数组,所以它会变成这样:
var monthData=["1-219", "1-474", "2-219", "2-474"....];
然后你可以检查数组是否包含month-id组合
return monthData.includes(month+"-"+ID);
如果您的目的是检查特定项目是否存在,那么您的原始表示是最好的,因为访问对象的属性是在恒定时间内完成的,而迭代数组则更昂贵(线性时间,通常虽然优化),所以即使它有点难看,如果您的目的是检查特定ID的存在,那么您的数据是最有效的表示