[英]how to access objects in an array by a property of those objects?
所以最近我必須檢查用戶是否安裝了某個插件,這顯然很容易完成:
if(typeof navigator.plugins['plugin name'] === 'undefined'){
alert('Please install plugin')
}
這並不奇怪,對我來說,我認為這只是訪問分配給對象plugin name
的plugins
對象。 (比如plugins['plugin name'] = {...}
)奇怪的是,如果你在console.log
使用navigator.plugins
變量,它就是這樣的:
>PluginArray
>0: Plugin
>1: Plugin
>2: Plugin
因此,可以使用navigotor.plugins['Plugin name']
和navigator.plugins[i]
訪問這些插件對象!
我的問題是,我怎樣才能實現類似的東西,所以我可以通過索引(簡單的迭代和保留數組功能)和所述對象的屬性(通過id或名稱輕松訪問)來訪問數組的對象?
navigator.plugins對象有PluginArray
原型,所以我想這個類以某種方式覆蓋obj['index']
訪問器並查找具有給定索引作為其'name'屬性的對象(s?),或者通過迭代訪問時,維護一個內部數組,將數字索引映射到名稱([i] ='index')或將名稱映射到索引的內部對象(.index = i)。
那么關於最佳方法的任何想法?
編輯:正如Oriol所指出的,你可以為兩個鍵分配相同的對象( arr[0] = arr[obj.name] = obj
) 如果obj.name是唯一的 ,如果它不是你,這可以很好地工作風險覆蓋之前設置的密鑰。 如果你想使用像唯一數據庫索引這樣的東西作為第二個密鑰,那絕對是一個便宜而簡單的解決方案。
您可以為多個屬性分配相同的值:
var obj = {};
obj[0] = obj.name0 = value0;
obj[1] = obj.name1 = value1;
obj[2] = obj.name2 = value2;
這與DOM集合實現的行為相同; 在內部,如果傳遞的鍵是一個int轉發它到.item()
如果它的字符串轉發到.namedItem()
。
目前最接近的是ES6 Proxy()
,支持非常有限;
"use strict";
let Plugins = new Proxy(
[{name: 'pdf', mime: 'pfft/pdf'}, {name: 'swf', type: 'flash'}],
{
get: function(obj, prop)
{
if (!isNaN(prop)) // by index
return obj[prop]
for (var k in obj) // lookup a name
if (obj[k].name == prop)
return obj[k];
}
});
console.log(Plugins); // Array [ Object, Object ]
console.log(Plugins[0]); // Object { name: "pdf", type: "doc" }
console.log(Plugins['pdf']); // Object { name: "pdf", type: "doc" }
數組是最基本的,使用魔術length
鍵擴展的對象 - 您可以為其添加任何鍵值。 如果你想看到鍵,迭代它會變得稍微復雜一些,設置任何等於數字的東西(即arr["1"]
)將等同於設置數組的數字索引。
navigator.plugins
有一個原型PluginArray
,它鏈接到將插件名稱轉換為數組中的條目的本機代碼。
使用console.log(navigator.plugins.__proto__)
來查看。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.