迭代一个对象,找到两个ID变量的匹配项

时间:2016-08-17 11:06:53

标签: javascript object

我只有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 == 1ID == 459返回true

如果month == 1ID == 917返回false(月917数据中不存在1

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

如果month == 5ID == 917返回true

如果month == 5ID == 100返回false100的数据中不存在month 5

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

4 个答案:

答案 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"];
}