我只有JS阵列的经验,而不是对象,所以我试图学习如何导航它们。我将很感激任何答案和良好的解释,显示完成以下任务的过程:
我有一个月(表示为整数,1-11
),以及各种ID的数据集合(也表示为整数,例如474
)
数据看起来像这样(一些较长数据的子集):
var myData = {
1: {474: true, 459: true},
4: {474: true, 578: true, 987: true, 459: true, 917: true, 296: true},
5: {474: true, 578: true, 1036: true, 391: true, 987: true, 459: true, 917: true, 296: true}
};
我需要
a)根据我的month
值找到索引中的第一个键。 E.g var month = 4
;
b)找到该子对象中ID
值的真或假,例如var ID = 917
我需要检查的一些例子:
如果month == 1
和ID == 459
返回true
如果month == 1
和ID == 917
返回false
(月917
数据中不存在1
如果month == 4
和ID == 987
返回true
如果month == 5
和ID == 917
返回true
如果month == 5
和ID == 100
返回false
(100
的数据中不存在month 5
我已经确保数据中存在所有月份1-11
,因此我不需要额外检查以查看对象中是否存在month
值。它只需要使用month
找到第一个密钥,然后在该子对象中搜索ID
,如果发现它返回true
。
答案 0 :(得分:2)
你可以做到
!!myData[month][ID]
这样它会将undefined变为false,而true将保持为真
答案 1 :(得分:2)
您可以使用检查并将结果转换为布尔值。
function check(month, id) {
return !!(myData[month] && myData[month][id]);
}
var myData = { 1: { 474: true, 459: true }, 4: { 474: true, 578: true, 987: true, 459: true, 917: true, 296: true }, 5: { 474: true, 578: true, 1036: true, 391: true, 987: true, 459: true, 917: true, 296: true } };
console.log(check(1, 459)); // true
console.log(check(1, 917)); // false (917 not present in data for month 1
console.log(check(4, 987)); // true
console.log(check(5, 917)); // true
console.log(check(5, 100)); // false (100 not present in data for month 5)
console.log(check(0, 100)); // false (no data present for month 0)
答案 2 :(得分:2)
您可能已经知道{ }
语法在Javascript中定义了一个对象。
对象始终由键/值对构成,其中键必须是唯一值,而值可以是任何值。例如。另一个对象,数字。
要按键访问对象的值,通常会执行myData.5
这会返回嵌套对象{474: true, 578: true, 1036: true, 391: true, 987: true, 459: true, 917: true, 296: true}
但是如果你可以预先取得你想要的东西,你只能使用点符号,例如来自对象的键1
。在某些情况下,您不确定要访问的密钥。例如。在一些数据处理之后,算法可以从密钥3
访问值,有时从密钥1
访问值,那么对于这种情况,您可以myData["5"]
。其中"5"
字符串值通常是变量。这样您就可以根据变量的值动态访问密钥。
所以对你的情况;如果您只想检查特定月份的密钥是否存在,那么就这样做;
myData[month][ID]
如果此检查返回true
,则我们知道该月份具有该密钥。否则就错了。
var myData = {
1: {474: true, 459: true},
4: {474: true, 578: true, 987: true, 459: true, 917: true, 296: true},
5: {474: true, 578: true, 1036: true, 391: true, 987: true, 459: true, 917: true, 296: true}
};
if (myData[1][474]) {
console.log("key 474 exists in month 1.");
}
if (myData[1][974]) {
console.log("key 974 exists in month 1.");
}
else {
console.log("Key 974 doesn't exists for month 1.");
}
答案 3 :(得分:0)
输入数据:
var myData = {
1: {474: true, 459: true},
4: {474: true, 578: true, 987: true, 459: true, 917: true, 296: true},
5: {474: true, 578: true, 1036: true, 391: true, 987: true, 459: true, 917: true, 296: true}
};
a)根据我的月份值找到索引中的第一个键。 E.g var 月= 4;
您只需执行此操作,myData["4"]
,
这将返回{474: true, 578: true, 987: true, 459: true, 917: true, 296: true}
让我们把它放在一个变量中,比如var subObject = myData["4"];
b)找到该子对象中我的ID值的真或假,例如 var ID = 917
你可以再做同样的事情,subObject["917"]
,
这将返回true
。
如果subObject
没有该ID,则会返回undefined
。
因此返回的可能值可以是true, false or undefined
。
让我们在变量中var value = subObject["917"]
。
要始终获得布尔值,我们可以使用双重否定,如!!value
。这将使undefined, null, false and empty string
作为false
返回,而true保持为true
简而言之,正如Dave建议的那样,我们可以摆脱变量并将其写成一行!!myData[month][ID]
。
但是,请注意,如果myData[month]
为undefined
,则myData[month][ID]
会抛出错误,因此在if条件下检查它总是明智的。请查看此问题以获取更多信息Checking if a key exists in a JavaScript object?
if(("4" in myData) && ("917" in myData["4"])){
return myData["4"]["917"];
}