如何通过这些对象的 属性 访问数组中的对象?
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" }
所以最近我不得不检查用户是否安装了某个插件,这显然很容易完成:
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" }