简化对象,我可以将此数据创建为数组吗?

时间:2016-10-06 15:23:09

标签: javascript arrays object

我有一个包含一些数据的对象。第一个维度从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];
            }

4 个答案:

答案 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的存在,那么您的数据是最有效的表示