簡體   English   中英

在javascript對象中,獲取值屬性的最佳方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM