2012-01-29 88 views
0

,如果我們有一個JavaScript對象在javascript對象中,獲取值的屬性的最佳方法是什麼?

var calories = { apple:200, pear:280, banana:300, peach:325 } 

什麼是找到(第一)的水果,有280個卡路里的最佳方式?

可能Object.getOwnPropertyNames(calories).forEach...但應該有更好的方法。

例如,我正在考慮Array.prototype.indexOf(),它爲陣列做同樣的事情。

+0

你想第一個含有_exactly_ 280卡路里或至少280卡路里的熱量? – nnnnnn 2012-01-29 11:48:40

+0

@nnnnnn - 一個簡單的反向查找 – 2012-01-29 11:49:56

+0

很酷。遺憾的是,沒有內建的等同於'.indexOf()',但顯然它很簡單,可以創建一個簡短的函數來完成它。一個'for..in'循環是我目前的建議,只是因爲它受到舊版瀏覽器的支持。 – nnnnnn 2012-01-29 11:57:19

回答

1

線性搜索使用for..in結構:

var fruit = null; 

for (var prop in calories) { 

    if (calories[prop] == 280) { 

    fruit = prop; 
    break; 
    } 
} 
+0

我認爲你應該使用'hasOwnProperty()'在你的循環中過濾'prop' - 幾乎所有'Object.getOwnPropertyNames()'爲你所做的工作 – 2012-01-29 11:53:11

+0

代碼基於你的'calories'對象定義的例子,在這種情況下,hasOwnProperty()檢查不是必需的。 – Sim 2012-01-29 11:58:29

+0

你可能是對的。只是養成了習慣。 – 2012-01-29 12:08:17

1

但應該有一個更好的辦法

沒有,實在不應該。 99%的用例都是這樣,開發人員更關心從密鑰中獲取價值。

+2

雖然我尊重你的意見,我請求不同。例如,Array有indexOf(),做同樣的事情,並且在數組中有99%的時間有興趣通過索引獲取值。開發人員(我已經超過35年)常常對對稱屬性感興趣。 – 2012-01-29 11:47:01

+0

一維映射和二維映射是不同的概念。 javascript的對象表示一維映射。 – Kos 2012-01-29 13:12:06

2

注意!不保證所有瀏覽器都返回相同的結果。事實上他們沒有。

例如:

var x = { a: 1, b: 1 }; 
delete x.a; 
x.a = 1; 

我應該x.indexOf(1)回到這裏? ba?原來,IE的屬性枚舉與其他瀏覽器不同,規範說這完全沒問題。所以IE會返回a,而其他瀏覽器會返回b

你可以通過調用

Object.getOwnPropertyNames(x); // IE: a,b - other browsers: b,a 
Object.keys(x); // same 
for (var i in x) { console.log(i); } // same 

顯然驗證,這裏的問題是,有「秩序」的目標指標沒有概念,因爲,這就是對象是:無序的地圖。

+0

真的很好。解釋了爲什麼沒有內置向後搜索機制。 – 2012-01-30 00:32:51

+0

原來,Object.getOwnPropertyNames()甚至可能使用與Object.keys()不同的排序。因此,畢竟這個規範有點混亂,某種'Object.prototype.indexOf()'不會讓事情變得更糟。 – user123444555621 2012-01-30 16:14:34

0

你可以擴展對象的這樣的原型:

// Returns one key (any) of the value if it exists, or undefined if not 
Object.defineProperty(Object.prototype, "keyOf", { 
    value: function(value) { 
     for (var key in this) if (this[key] == value) return key; 
     return undefined; 
    } 
}); 

使用這種方式,而不是常見的Object.prototype.keyOf = ...將與jQuery的工作,如果你使用它。

然後你可以使用這樣的:

var myArray = {...}; 
var index = myArray.keyOf(value); 

它也將與正常工作數組:[...],所以你可以用它來代替indexOf了。

記得使用三字符運營商,以檢查它是否未定義:

index === undefined // to check the value/index exists  
index !== undefined // to check the value/index does not exist 

當然,如果你願意,你可以改變函數的名稱,切記不要聲明一個名爲「未定義」的任何變量。

也請記住,爲的indexOf,它將返回定義最多一個關鍵,但它可能是一個以上的可能,所以在這種情況下,你需要像這樣(.keysOf(...)):

// Returns all the keys of the value if it exists (an empty array if not) 
Object.defineProperty(Object.prototype, "keysOf", { 
    value: function(value) { 
     var allKeys = []; 
     for (var key in this) if (this[key] == value) allKeys.push(key); 
     return allKeys; 
    } 
}); 
相關問題