[英]in a javascript object, what's best way to get the attribute of a value?
如果我們有一個javascript對象
var calories = { apple:200, pear:280, banana:300, peach:325 }
查找(含)280卡路里水果的最佳方法是什么?
可以Object.getOwnPropertyNames(calories).forEach...
但應該有更好的方法。
例如,我在想Array.prototype.indexOf()
,它對Array做同樣的事情。
警告! 不能保證所有瀏覽器都返回相同的結果。 實際上他們沒有。
例如:
var x = { a: 1, b: 1 };
delete x.a;
x.a = 1;
x.indexOf(1)
應該在這里返回什么? b
還是a
? 事實證明,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
顯然,這里的問題是對象索引上沒有“順序”的概念,因為對象就是:無序映射。
但是應該有更好的方法
不,真的不應該。 所有用例中有99%都用這種方式,開發人員對從密鑰中獲取價值更感興趣。
使用for..in
構造的線性搜索:
var fruit = null;
for (var prop in calories) {
if (calories[prop] == 280) {
fruit = prop;
break;
}
}
您可以這樣做擴展對象的原型:
// 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;
}
});
如果您使用jQuery,則可以使用這種方式代替常見的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;
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.