如何从javascript树数组中选择项目?
我有一个javascript数组,它定义了这样一个无限树如何从javascript树数组中选择项目?,javascript,Javascript,我有一个javascript数组,它定义了这样一个无限树 z=['~GROUPHEAD 0~', 'Intro', 'Summary', ['~GROUPHEAD 1~', 'Do this', ['~GROUPHEAD 2~', 'Task 1', 'Task 2' ] ] ] 现在 z[0]='~GROUPHEAD 0~' z[1]='Intro' z[2]='S
z=['~GROUPHEAD 0~',
'Intro',
'Summary',
['~GROUPHEAD 1~',
'Do this',
['~GROUPHEAD 2~',
'Task 1',
'Task 2'
]
]
]
现在z[0]='~GROUPHEAD 0~'代码>
z[1]='Intro'代码>
z[2]='Summary'代码>
z[3][0]='~GROUPHEAD 1~'代码>
z[3][1]='Do this'代码>
z[3][2][0]='~GROUPHEAD 2~'代码>
z[3][2][1]=“任务1”代码>
z[3][2][2]=“任务2”代码>
z..[0]是标题
问题
我想发送一个号码,比如说322或3.2.2或[3][2][2]
来选择“任务2”(即z[3][2][2]
)
谁能帮忙;还有更好的方法吗
编辑
我需要称之为100秒时间您可以拆分数字并递归查找:
var path = '3.2.2',
root = z;
var item = (function walk( root, path ){
root = root[ path.shift() ];
return path.length ? walk( root, path ) : root;
})( root, path.split('.') );
或者你可以做一些类似的事情:
var path = '3.2.2'
, item = eval('z[' + path.replace(/[^\d\.]/g, '').split('.').join('][') + ']');
上一行:
- 通过删除非数字/小数来清理字符串
- 构造字符串“z[3][2][2]”
- 计算此新字符串以直接给出结果
如果有人通过无效路径,您应该将其包装在一个try/catch
中。您可以拆分数字并递归查找:
var path = '3.2.2',
root = z;
var item = (function walk( root, path ){
root = root[ path.shift() ];
return path.length ? walk( root, path ) : root;
})( root, path.split('.') );
function selectFromArray(ar, index)
{
//get array from indexes
var index_ar = index.split('.');
if(index_ar.length > 1)
{
//set new index value
var indx = "";
//append new index value
for(var i = 1; i < index_ar.length; i++)
{
if(indx.length > 0)
indx += '.';
indx += index_ar[i];
}
//call method again with new index
return selectFromArray(ar[intParse(index_ar[0])], indx);
}
//return value
return ar[intParse(index_ar[0])];
}
或者你可以做一些类似的事情:
var path = '3.2.2'
, item = eval('z[' + path.replace(/[^\d\.]/g, '').split('.').join('][') + ']');
上一行:
- 通过删除非数字/小数来清理字符串
- 构造字符串“z[3][2][2]”
- 计算此新字符串以直接给出结果
如果有人通过无效路径,您应该将其包装在一个try/catch
中
function selectFromArray(ar, index)
{
//get array from indexes
var index_ar = index.split('.');
if(index_ar.length > 1)
{
//set new index value
var indx = "";
//append new index value
for(var i = 1; i < index_ar.length; i++)
{
if(indx.length > 0)
indx += '.';
indx += index_ar[i];
}
//call method again with new index
return selectFromArray(ar[intParse(index_ar[0])], indx);
}
//return value
return ar[intParse(index_ar[0])];
}
如果索引超出范围,它将失败:)
如果索引超出范围,它将失败:)解决方案,而不使用不检查无效路径的eval
:
var z = ['~GROUPHEAD 0~',
'Intro',
'Summary',
['~GROUPHEAD 1~',
'Do this',
['~GROUPHEAD 2~',
'Task 1',
'Task 2'
]
]
];
function accessArray(arr, index) {
var parts = index.split(".");
var a = arr;
for(var i = 0; i < parts.length; i++)
a = a[parts[i]];
return a;
}
alert(accessArray(z, "3.2.2"));
var z=['~GROUPHEAD 0~',
‘简介’,
"摘要",,
['~GROUPHEAD 1~',
“这样做”,
['~GROUPHEAD 2~',
“任务1”,
“任务2”
]
]
];
函数访问数组(arr,索引){
var部分=指数分割(“.”);
var a=arr;
对于(变量i=0;i
解决方案,不使用不检查无效路径的eval
:
var z = ['~GROUPHEAD 0~',
'Intro',
'Summary',
['~GROUPHEAD 1~',
'Do this',
['~GROUPHEAD 2~',
'Task 1',
'Task 2'
]
]
];
function accessArray(arr, index) {
var parts = index.split(".");
var a = arr;
for(var i = 0; i < parts.length; i++)
a = a[parts[i]];
return a;
}
alert(accessArray(z, "3.2.2"));
var z=['~GROUPHEAD 0~',
‘简介’,
"摘要",,
['~GROUPHEAD 1~',
“这样做”,
['~GROUPHEAD 2~',
“任务1”,
“任务2”
]
]
];
函数访问数组(arr,索引){
var部分=指数分割(“.”);
var a=arr;
对于(变量i=0;i
这里有一种方法:(单击右上角jsbin.com中的编辑按钮来使用它)。代码如下:
Array.prototype.pick = function(num) {
var levels = num.split('.');
var out = this;
for (var i=0;i<levels.length;i++) {
out = out[parseInt(levels[i])];
}
return out;
};
// usage
myArray.pick('3.2.2');
Array.prototype.pick=函数(num){
var levels=num.split('.');
var out=这个;
对于(var i=0;i这里有一种方法:(单击右上角的jsbin.com中的编辑按钮)代码如下:
Array.prototype.pick = function(num) {
var levels = num.split('.');
var out = this;
for (var i=0;i<levels.length;i++) {
out = out[parseInt(levels[i])];
}
return out;
};
// usage
myArray.pick('3.2.2');
Array.prototype.pick=函数(num){
var levels=num.split('.');
var out=这个;
对于(var i=0;i非常不切实际,但制作起来非常有趣:p
var num = 322;
if (num < 10)
meh = z[num];
else if (num < 100)
meh = z[Math.floor(num/10)][Math.floor(num % 10)];
else
meh = z[Math.floor(num/100)][Math.floor(num/10 % 10)][Math.floor(num % 10)];
meh // results in "Task 2"
var num=322;
如果(数值<10)
meh=z[num];
否则如果(数值<100)
meh=z[数学地板(数量/10)][数学地板(数量%10)];
其他的
meh=z[数学下限(num/100)][数学下限(num/10%10)][数学下限(num%10)];
meh//结果为“任务2”
非常不切实际,但制作起来非常有趣:p
var num = 322;
if (num < 10)
meh = z[num];
else if (num < 100)
meh = z[Math.floor(num/10)][Math.floor(num % 10)];
else
meh = z[Math.floor(num/100)][Math.floor(num/10 % 10)][Math.floor(num % 10)];
meh // results in "Task 2"
var num=322;
如果(数值<10)
meh=z[num];
否则如果(数值<100)
meh=z[数学地板(数量/10)][数学地板(数量%10)];
其他的
meh=z[数学下限(num/100)][数学下限(num/10%10)][数学下限(num%10)];
meh//结果为“任务2”
这里有一种面向对象的方法来做同样的事情
MyCompanyGroup = function(name, description, task, parent, child) {
if (arguments.length == 0) return;
this._name = name;
this._description = description;
this._parent = parent;
this._child = child;
}
MyCompanyGroup.prototype.toString =
function() {
return "MyCompanyGroup";
}
var z = new MYCompanyGroup("~GROUPHEAD0~", "Intro", "Summary", this, this);
现在,您可以使用父子关系和
您还可以将所有这些对象存储在一个数组或一个数据库中,以便直接访问
如果您有未定义数量的字段,则始终可以在MyCompanyGroup中嵌入名称-值对数组
这种面向对象的方法有两个主要优点
由于数组下标不是硬编码的,因此可以在不中断代码的情况下向该结构添加更多字段
您可以按名称访问字段,这使代码更易于理解和维护
这里有一个面向对象的方法来做同样的事情
MyCompanyGroup = function(name, description, task, parent, child) {
if (arguments.length == 0) return;
this._name = name;
this._description = description;
this._parent = parent;
this._child = child;
}
MyCompanyGroup.prototype.toString =
function() {
return "MyCompanyGroup";
}
var z = new MYCompanyGroup("~GROUPHEAD0~", "Intro", "Summary", this, this);
现在,您可以使用父子关系和
您还可以将所有这些对象存储在一个数组或一个数据库中,以便直接访问
如果您有未定义数量的字段,则始终可以在MyCompanyGroup中嵌入名称-值对数组
这种面向对象的方法有两个主要优点
由于数组下标不是硬编码的,因此可以在不中断代码的情况下向该结构添加更多字段
您可以按名称访问字段,这使代码更易于理解和维护
很好的尝试,但是如果群头中的mare超过10个字段呢?比如说3.12.2->3122
lol,那么它就会失败:P但是有无数种方法可能出错。我只是想我会在混合中加入一个算术上的责备,但实际上eval是最好的方法。很好的尝试,但是如果群头中的mare超过10个字段呢?比如3.12.2->3122
lol然后它会失败:P但有无数种可能出错的方式。我只是想在混合中加入一个算术上的责备,但事实上,在我看来,eval是最好的方式。eval不会比for loop快吗?我怀疑。无论如何,如果你想知道,你总是可以尝试。eval不会比for loop快吗?我怀疑。我怀疑在任何情况下,如果你想知道,你可以随时尝试。谢谢!有些人看到我在JS中扩展一个核心对象会感到很奇怪,但这样使用它感觉更好,而不是将数组传递给其他方法。谢谢!有些人看到我在JS中扩展一个核心对象会感到很奇怪,但使用它感觉更好