2016-12-27 26 views
-1

我工作的動態結構,作爲一個基本的例子:測試動態對象是否有空字段的正確方法?

var myObj = { 
    "fruits" : { 
    "apples" : { 
     "color" : "red", 
     "price" : "$0.49" 
    } 
    }, 
    "colors" : {} 
}; 

所以我期待的是,例如水果,「橙色」不存在。我想測試它不存在,所以我可以添加它。

我在控制檯中看到,如果您嘗試訪問不存在的「對象」,則會被告知「未定義」。

這就是我正在尋找的,但我不想在控制檯中的錯誤,我想知道/預計它是空的,所以我可以添加到它。

如果我這樣做

console.log(myObj.fruits.apples.color); 

我會得到紅色,因此,如果我這樣做是爲了橙色

console.log(myObj.fruits.orange.color); 

它會說不確定的,至少如果我試圖

console.log(myObj.fruits.apples.weight); 

這應該是未定義的,我的jsfiddle沒有這麼熱,我現在無法再現那個未定義的console.log消息

好吧,所以似乎提供的對象存在,你可以測試一個未定義的屬性,如上面的重量示例。

我不是在尋找那個,我正在測試像「椰子」這樣的對象是否不存在,所以我可以使用extend將它添加到對象數組中。但我不想紅控制檯日誌錯誤,我希望能夠使用類似的比較來預測它:

if (myObj.fruits.coconut === "undefined") { 
    // means it doesn't exist, add it 
} 

我用我自己的測試實現,這將產生誤差,而不是未定義像上述

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof – deceze

+0

if(myObj.fruits.coconut === void 0).....或.. .... if(typeof myObj.fruits.coconut ===「undefined」) – Kenny

+0

你應該檢查可能不存在的* first *屬性,如果它應該是一個對象(這是你的情況),那麼你可以如果(!myObj.fruits.coconut)myObj.fruits.coconut = {color:'brown'};' – trincot

回答

1

您應檢查第一財產可能不EXI st:因此在確定coconut存在之前,請不要檢查coconut.color屬性。

如果選中的屬性應該是一個對象(這是你的情況下),那麼你可以用!運營商這樣做:

if (!myObj.fruits.coconut) myObj.fruits.coconut = { color: 'brown' }; 
0

如果你想測試一個屬性的對象上存在蘋果重量控制檯日誌演示中,你可以使用Object.prototype.hasOwnProperty()

myObj.fruits.hasOwnProperty("apples") //true 
myObj.fruits.hasOwnProperty("oranges") //false 
+0

感謝您的信息,我看到這是用於內置的鍵值對 –

0

正如有人在評論中指出的,你至少有兩個方法。

第一位的,最簡單的,是簡單地做

if(!myObj.fruits.cononut) 
    // do stuff 

但是因爲它「做的東西」即使.coconutfalse,例如這是不是很安全。

人們通常不會是

if(typeof myObj.fruits.cononut === "undefined") 
     // do stuff 

來檢查,如果該字段實際上不存在,並且未設置(===還檢查同一類型)。

然而,這個時候,我想你能永遠與此嘗試(不深入的檢驗):

if(!("cononut" in myObj.fruits)) 
    // do stuff 

,檢查爲重點是否存在等。

編輯

由於@hackerrdave指出的那樣,你也可以用.hasOwnProperty方法。

+0

我想我會嘗試這種方法或hackerrdave提到的!obj.subobj方法實際上沒有工作,它爲那個工作案件。不知道出了什麼問題,但謝謝你的選擇。 –

+0

其實我的問題似乎是使用字符串來嘗試訪問對象屬性。嗯 –

+0

你可以舉一個「使用字符串來嘗試和訪問一個對象屬性」的例子嗎? –

0

下劃線JS包含_.haslink

_.has(對象鍵) 是否該對象包含給定的關鍵?與object.hasOwnProperty(key)相同,但對hasOwnProperty函數使用安全引用,以防意外覆蓋。

_.has({a: 1, b: 2, c: 3}, "b"); 
=> true 

顯然,hackerrdave答案是足夠了,但如果你使用underscorejs那麼它是稍微簡單一些。

+0

用普通的JavaScript,你已經可以在'obj'中編寫'key'。對於這個庫使用一個庫似乎有點矯枉過正,並且仍然至少寫出與(_has。(obj,key)')一樣長的東西。 – trincot

相關問題