如何通过这些对象的 属性 访问数组中的对象?

how to access objects in an array by a property of those objects?

所以最近我不得不检查用户是否安装了某个插件,这显然很容易完成:

if(typeof navigator.plugins['plugin name'] === 'undefined'){
  alert('Please install plugin')
}

这对我来说并不奇怪,我认为它只是访问了分配给 plugins 对象的 plugin name 的对象。 (喜欢 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 原型,所以我想这个 class 它以某种方式覆盖了 obj['index'] 访问器并查找对象(?)将给定的索引作为它们的 'name' 属性,通过在访问时迭代,维护一个将数字索引映射到名称的内部数组([i] = 'index')或一个内部对象将名称映射到它们的索引 (.index = i).

对最佳方法有什么想法吗?

编辑:正如 所指出的,您可以将同一个对象分配给两个键 (arr[0] = arr[obj.name] = obj),这可以很好地工作 if obj.name是唯一的 ,如果不是,您可能会覆盖之前设置的密钥。如果您想使用唯一数据库索引之类的东西作为第二个键,这绝对是一个便宜又简单的解决方案。

数组是最基本的对象,用神奇的 length 键扩展 - 您可以向其中添加您想要的任何键值。如果您想查看键,遍历它会稍微复杂一些,并且设置任何可以等同于数字的内容(即 arr["1"])将等同于设置数组的数字索引。

您可以为多个属性分配相同的值:

var obj = {};
obj[0] = obj.name0 = value0;
obj[1] = obj.name1 = value1;
obj[2] = obj.name2 = value2;

navigator.plugins 有一个原型 PluginArray,它链接到将插件名称转换为数组条目的本机代码。

使用console.log(navigator.plugins.__proto__)查看此内容。

这与 DOM 集合实现的行为相同;在内部,如果传递的密钥是一个整数,则将其转发到 .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" }