2016-08-17 94 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"]; 
}