我发现没有办法做到这一点。不过,谢谢大家! In javascript, can I override the brackets to access characters in a string?
我有这样的事情:
function f() {
var list = [{name: 'test'}, {name: 'test2'}];
}
我想从该列表中获取属性中的属性,我认为有一些方法可以覆盖默认[],但我真的不知道要查找什么。
f[0] // {name: 'test'}
f['test2'] // {name: 'test2'}
答案 0 :(得分:1)
除非您执行以下两种操作之一,否则list
变量将专用于f()
。
首先,您可以尝试从list
返回f()
,以便您可以访问所需的属性。
function f() {
var list = [{name: 'test'}, {name: 'test2'}];
return list;
}
var f = f();
f[0] // {name: 'test'};
f['test'] // will return undefined; we'll come back to this
第二个,我认为这个选项可能就是你在用'oop'标记问题时所需要的,你可以使f()
成为构造函数:
function f() {
this.list = [{name: 'test'}, {name: 'test2'}];
}
var f1 = new f();
f1['list'][0] // {name: 'test'};
f1.list[0] // will also return {name: 'test'};
f1.list['test'] // still will return undefined...
...
您无法使用['test']
或['test2']
访问值的原因是因为它们是您的值,而通常值是我们想要使用键在对象中访问的值(在这种情况下['name']
或.name
)。所以你可能想要的是这样的:
f1.list[0].name // will return 'test'
f1.list[1].name // will return 'test2'
希望这可以消除困惑。
答案 1 :(得分:0)
只需使用对象而不是数组:
var byname = {
"test": {name: 'test'},
"test2": {name: 'test2'}
};
// bracket notation:
byname["test2"] // {name: 'test2'}
// dot notation:
byname.test // {name: 'test'}
由于您说您永远不会通过索引访问结构,因此可以使用无序键值映射结构。要保存输入,您也可以从数组中动态创建该对象:
var list = [{name: 'test'}, {name: 'test2'}];
var byname = {};
for (var i=0; i<list.length; i++)
byname[list[i].name] = list[i];