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

时间:2015-08-03 11:28:03

标签: javascript arrays javascript-objects

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

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

这对我来说并不令人惊讶,我认为它只是访问了分配给plugin name对象的plugins的对象。 (如plugins['plugin name'] = {...}) 奇怪的是,如果console.log变量为navigator.plugins,它就会出现:

>PluginArray
 >0: Plugin
 >1: Plugin
 >2: Plugin

因此,可以使用navigotor.plugins['Plugin name']navigator.plugins[i]访问这些插件对象!

我的问题是,我怎样才能实现类似的东西,所以我可以通过索引(简单迭代和保留数组功能)和所述对象的属性(通过id或名称轻松访问)来访问数组的对象? / p>

navigator.plugins对象有PluginArray原型,所以我想这个类以某种方式覆盖obj['index']访问器并查找具有给定索引的对象(s?)作为&# 39;名称'属性,通过访问时迭代,维护将数字索引映射到名称的内部数组([i] ='索引')或将名称映射到其索引的内部对象(.index = i)

关于最佳方法的任何想法?

编辑:正如Oriol指出的那样,您可以为两个键(arr[0] = arr[obj.name] = obj)分配相同的对象,如果obj.name是唯一的,这可以很好地工作 ,如果不是你冒险覆盖之前设置的密钥。如果你想使用像唯一数据库索引这样的东西作为第二把钥匙,那绝对是一种便宜而简单的解决方案。

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

数组是最基本的,使用魔法length键扩展的对象 - 您可以为其添加任何键值。如果你想看到键,迭代它会变得稍微复杂一些,设置任何可以等于数字的东西(即arr["1"])将等同于设置数组的数字索引。

答案 3 :(得分:0)

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

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