0

我发现没有办法做到这一点。不过,谢谢大家! 在javascript中,我可以覆盖括号以访问字符串中的字符吗?

我有这样的事情:

function f() {
    var list = [{name: 'test'}, {name: 'test2'}];
}

我想从函数内部的那个列表中获取属性,我认为有一些方法可以覆盖默认 [],但我真的不知道要查找什么。

f[0] // {name: 'test'}
f['test2'] // {name: 'test2'}
4

2 回答 2

1

除非您做两件事之一,否则您的list变量将是私有的。f()

首先,您可以尝试从那里返回listf()这样您就可以到达您需要的属性。

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']or访问值的['test2']原因是因为它们是您的值,而通常这些值是我们想要使用键(在本例中为['name']or .name)在对象中访问的值。所以你可能想要的是这样的:

f1.list[0].name // will return 'test'
f1.list[1].name // will return 'test2'

希望这能消除混乱。

于 2013-02-17T10:45:23.597 回答
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];
于 2013-02-17T11:57:35.020 回答