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()
目前最接近这一点的是ES6Proxy()
,支持非常有限
"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(例如来自数据库),那么这绝对是一个选项!有趣!迫不及待地等待,直到所有现代浏览器都完全支持它:)再过一天左右,但这似乎是一个可以接受的答案!