簡體   English   中英

如何通過這些對象的屬性訪問數組中的對象?

[英]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 nameplugins對象。 (比如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.

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