如何从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

我有一个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]='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中扩展一个核心对象会感到很奇怪,但使用它感觉更好