遍历对象以查找两个ID变量的匹配

3

我只有 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值查找索引中的第一个键。例如 var month = 4;

b) 查找该子对象中ID值是真或假,例如 var ID = 917

以下是一些我需要检查的示例:

如果month == 1,并且ID == 459,则返回true

如果month == 1,并且ID == 917,则返回false917不在month 1数据中)

如果month == 4,并且ID == 987,则返回true

如果month == 5,并且ID == 917,则返回true

如果month == 5,并且ID == 100,则返回false100不在month 5数据中)

我已经保证了所有月份1-11都存在于数据中,因此我不需要额外检查month值是否存在于对象中。只需要使用month查找第一个键,然后在该子对象中搜索ID,如果找到则返回true


1
如果(myData[month][ID]) { /* 做某些事情 */ } - 不需要迭代或搜索,直接直接测试属性。 - nnnnnn
它只需要定位第一个键,这个键只能是“月份”,如果我们在谈论学习的话,要非常明确。至于问题,只需访问它们,并防范“未定义”的值,然后您就可以开始了。 - Dellirium
4个回答

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)


请解释为什么在return之前要加上!!?这是因为如果缺少myData[month][id],它将返回undefined,所以!!undefined意味着false吗? - A l w a y s S u n n y
1
@BeingSunny,没错,OP想要一个布尔值的结果,第一个检查返回undefined或对象,第二个检查返回undefinedtrue。为了转换结果,双重否定是将真/假值转换为truefalse的最短方式。 - Nina Scholz
太棒了...感谢您的解释。还有一个请求,您能否向我推荐一些JS博客或在线网站,帮助我清楚地理解JS的事情。我通常会看MDN、Stackoverflow、Medium和daily js。实际上,您回答JS的复杂问题的方式让我非常钦佩。 - A l w a y s S u n n y
谢谢提供链接,我喜欢详细的东西,因为它可以帮助我更清楚地理解。再次感谢。 - A l w a y s S u n n y

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,则我们知道该月份具有该键。反之为false。

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


@user1486133,希望对象说明有所帮助。 - Samuel Toh
这是最可行的答案。 - Dellirium
谢谢夸奖 =o - Samuel Toh
谢谢,这是一个很棒的答案 :) - user1486133

2
你可以直接这样做。
!!myData[month][ID]

这样它将undefined转换为false,而true将保持不变。


虽然这是正确的答案,但如果她寻找的不是真/假的话,这将不起作用。而且由于问题的开头是“我正在尝试学习对象是如何工作的”,我认为这不是正确的处理方式。 - Dellirium

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) 根据我的月份值,在我的索引中找到第一个键。例如,var month = 4;
你可以简单地这样做,myData["4"],这将返回{474: true, 578: true, 987: true, 459: true, 917: true, 296: true} 让我们把它放在一个变量中,就像这样var subObject = myData ["4"]; b) 在该子对象中查找我的ID值的true或false,例如 var ID = 917
  • 你可以再次执行相同的操作,subObject ["917"], 这将返回true

  • 如果subObject没有ID,则会返回undefined

  • 因此可能返回的值包括true、false或undefined

  • 我们也可以将其放在一个变量中:var value = subObject ["917"]。 为了始终获得布尔值,我们可以使用双重否定,像这样:!!value。 这将使undefined、null、false和空字符串 返回为false,而true保持为true

简而言之,正如Dave建议的那样,我们可以摆脱变量,并将其写成一行,如!!myData [month] [ID]

但是,请注意,如果myData [month]undefined,那么myData [month] [ID]将会抛出错误,因此在if条件语句中检查它总是明智的选择。 了解更多信息可以查看这个问题如何在JavaScript对象中检查一个键是否存在?

if(("4" in myData) && ("917" in myData["4"])){
   return myData["4"]["917"];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接