0

我正在开发一个在 Javascript 中使用嵌套数组的应用程序。我有一个这样的数组:

var a = ["Once upon a time there was a man."];

    a[1] = ["He was tall."];
           a[1][1] = ["He often bumped his head."];

    a[2] = ["He was short."];
           a[2][1] = ["He couldn't reach high shelves."]

有没有一种简单的方法来确定一个值处于什么级别的数组?我希望能够输入“他经常撞到头”并让它返回“a [1] [1]”(或者如果我输入“他很矮”,我会返回“a [2]” )。数组将具有不确定和波动的大小。

提前感谢您对此的任何帮助。我是 javascript 和 jquery 的新手,因此对您的解决方案的任何解释都将受到高度赞赏。再次感谢。

4

3 回答 3

0

一些递归应该可以解决问题:

Array.prototype.recursiveIndexOf = function(item, start) {
    var i = this.indexOf(item);
    var r, c;

    start = start || [];

    if(i > -1) {
        return start.concat([i]);
    }

    for(i = 0; i < this.length; i++) {
        c = this[i];

        if(Object.prototype.toString.call(c) === '[object Array]') {
            r = c.recursiveIndexOf(item, start.concat(i));

            if(r !== null) {
                return r;
            }
        }
    }

    return null;
};

这是一个演示。

于 2012-04-08T00:56:19.297 回答
0

对于两级数组,您可以这样做:

function findMultiArray(array, str) {
    var innerArray;
    for (var i = 0; i < array.length; i++) {
        innerArray = array[i];
        for (var j = 0; j < innerArray.length; j++) {
            if (innerArray[j] == str) {
                return([i, j]);
            }
        }
    } 
    return null;
}

请注意,我只返回一个带有两个索引的实际数组,因为如果您需要数据形式的数据,这会更容易使用。

与您的请求不同,它永远不会返回等价的a[1]因为a[1]是一个数组,而不是一个字符串,所以匹配是 with a[1][0],而不是 with a[1]。在这种情况下,它将返回[1,0].

如果您希望返回值采用不同的形式,只需一行代码即可看到匹配项,而 i 和 j 是匹配的索引。

如果数组的级别可以任意深,在不同的地方有不同的深度,那么这将涉及更多一些,并且需要询问项目的类型以查看它们是否包含嵌套数组或仅包含字符串,并且需要某种堆栈来保持当前位置。递归是最容易的。

于 2012-04-08T01:02:43.667 回答
0

这是一个更简单的答案。;)

function array_search(ob,str)
{
    for(var i=0;i<ob.length;++i)
    {
        if(typeof(ob[i])=='object'&&(ob[i] instanceof Array))
        {
            var foo=array_search(ob[i],str);
            if(foo!=null)
                return i+'->'+foo;
        }else
        if(typeof(ob[i])=='string'&&ob[i]==str)
        {
            return i;
        }
    }
    return null;
}

var a = ["Once upon a time there was a man."];
a[1] = ["He was tall."];
a[1][1] = ["He often bumped his head."];
a[2] = ["He was short."];
a[2][1] = ["He couldn't reach high shelves."]

alert(array_search(a,'He was short.'));
于 2012-04-08T01:13:10.037 回答