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

Javascript 如何通过数组中对象的属性访问这些对象?,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,因此,最近我不得不检查用户是否安装了某个插件,这显然很容易做到: if(typeof navigator.plugins['plugin name'] === 'undefined'){ alert('Please install plugin') } 这对我来说并不奇怪,我认为它只是访问了分配给plugins对象的pluginname的对象。(如插件['plugin name']={…}) 奇怪的是,如果您使用console.lognavigator.plugins变量,它的结果如下:

因此,最近我不得不检查用户是否安装了某个插件,这显然很容易做到:

if(typeof navigator.plugins['plugin name'] === 'undefined'){
  alert('Please install plugin')
}
这对我来说并不奇怪,我认为它只是访问了分配给
plugins
对象的
pluginname
的对象。(如
插件['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”属性的对象,维护将数字索引映射到名称([i]=“index”)的内部数组或将名称映射到其索引(.index=i)的内部对象

那么,你对最好的方法有什么想法


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

数组是最基本的一个对象,它用一个神奇的
长度
键扩展-你可以向它添加任何你想要的键值。如果要查看键,则遍历它会变得稍微复杂一些,设置任何可以等同于数字的内容(即
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.\uuuuu proto\uuuuuu)
查看此操作。

这与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" }

我理解这一点,您可以创建一个数组
var arr=[“一”、“二”、“三”]
,然后
arr.anObj={…}
,它将具有键0、1、2和“anObj”。但这与问题无关,我想知道如何使
var arr=[{id:'2',name:'two'},{id:'3',name:'three'}]
然后通过
arr[0]
arr['two']
访问第一个对象-自定义getter是根据正确的名称进行的,我想不出任何关于任意键的方法-我能建议的最好方法是使用
set
wrapper来同时设置索引和键-也许是一个数组的自定义子类,其中包含custom.push()等?有趣的是,我没有想到这一点!但是对于像{name:'name','version':123}这样的对象结构,我不能有两个具有相同名称的对象,因为这将覆盖第一个对象的键(我将两次分配给obj['name'])。如果您的对象结构包含唯一ID(例如来自数据库),那么这绝对是一个选项!有趣!迫不及待地等待,直到所有现代浏览器都完全支持它:)再过一天左右,但这似乎是一个可以接受的答案!