我正在开发一个在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的新手,所以对您的解决方案的任何解释都将受到高度赞赏。再次感谢。
答案 0 :(得分: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;
};
答案 1 :(得分: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]
是一个数组,而不是一个字符串,所以匹配是a[1][0]
,而不是a[1]
}。在这种情况下,它将返回[1,0]
。
如果你想要一个不同形式的返回值,只有一行代码可以看到匹配,i和j是匹配的索引。
如果数组的级别可以在不同的位置具有不同深度的任意深度,那么这将涉及更多,并且需要询问项目的类型以查看它们是否包含嵌套数组或仅仅是字符串并且需要某种排序堆栈保持当前位置。使用递归最简单。
答案 2 :(得分: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.'));