2016-08-17 70 views
3

我只有JS阵列的经验,而不是对象,所以我试图学习如何浏览它们。我将不胜感激任何答案,并说明完成以下任务的过程:迭代通过一个对象来找到两个ID变量的匹配

我有一个月(以整数表示,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} 
}; 

我需要

一)找到根据我在我的索引中的第一关键值。例如,var month = 4;

二)查找是否真或假的我在子对象如IDvar ID = 917

什么,我需要检查一些例子:

如果month == 1ID == 459回报true

如果month == 1ID == 917返回false917不存在于月的数据1

如果month == 4ID == 987返回true

如果month == 5ID == 917true

如果month == 5ID == 100回报false100不存在数据month 5

我维护了所有月份1-11是目前的数据,所以我不需要额外的检查,看看对象中存在值。它只需要使用month找到第一个密钥,然后在该子对象中搜索ID,如果它发现它返回true

+1

'如果(MYDATA的[月] [ID]){/ *做某事* /}' - 无迭代或搜索需要的,只是直接测试性能。 – nnnnnn

+0

''它只需要找到第一个键“'只能有一个'月'键,只是在这里,如果我们正在谈论学习。至于这个问题,只需访问它们并防止“未定义”的值,你就很好。 – Dellirium

回答

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."); 
 
}

+0

@ user1486133希望对象解释有帮助。 –

+0

这是最可行的答案 – Dellirium

+0

感谢您的补充= o –

2

你可以做

!!myData[month][ID] 

,这样它会变成不确定变成假的,和真会留真

+0

虽然这是正确的答案,但如果她要寻找其他方面的信息,那么这是行不通的,因为问题的开始是“我正在努力学习物体是如何工作的”,我相信这不是正确的处理方式。 – Dellirium

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)

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

一)找到根据我一个月值在我的索引中的第一项。例如,变量 月= 4;

  • 只需将做到这一点,myData["4"], 这将返回{474: true, 578: true, 987: true, 459: true, 917: true, 296: true}

  • 让我们这一个变量,像这样var subObject = myData["4"];

二)查找是否对于该子对象中的我的ID值是true或false,例如 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

总之,戴维建议,我们可以摆脱的变量,它在同一行写为!!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"]; 
}