假设我们有以下一组嵌套数组:
var array = [
[a,b,c],
[c,d,e],
[e,f,g],
[g,h,i]
]
如果我们从[a,b,c]
开始,并希望找到以c
开头的任何嵌套数组,如果有,则将该数组的索引2
的元素推送到新的已经保存c
的数组,我们可以编写以下代码:
var container = [];
container.push(array[0][2]);
for (var i = 0; i < array.length; i++) if (array[0][2] === array[i][0]) container.push(array[i][2])
因此,{p> container
最终会成为[c,e]
。
足够简单。
但是,如果我们现在还要检查e
是否与其他array[i][0]
匹配,该怎么办?然后依此类推,直到我们检查了整个array
并最终得到以下数组:[c,e,g,i]
。
我要做的是查看任何给定数组的最后一个元素是否与任何其他数组的第一个元素匹配;如果是,则收集该数组中的最后一个元素,并检查该元素是否与任何其他嵌套数组的第一个元素匹配。
因此,如果我们从i
开始,我们最终会得到[i]
。
如果我们从元素g
开始,我们最终会得到[g,i]
。
现在我正在使用嵌套的for
循环和if/else
语句,如下所示:
for (var i = 0; i < array.length; i++) {
if (element === array[i][0]) {
container.push(array[i][2]);
for (var ii = 0; ii < array.length; ii++) {
if (array[i][2] === array[ii][0]) {
container.push(array[ii][2]);
for (var iii = 0; iii < array.length; iii++) {
if (array[ii][2] === array[iii][0]) {
container.push(array[iii][2])
for (var iiii = 0; iiii < array.length; iiii++) {
if (array[iii][2] === array[iiii][0]) {
container.push(array[iiii][2])
}
}
}
}
}
}
}
}
有没有更有效的方法来实现这一目标?
我应该提到初始数组可以包含重复的值,例如:[ [a,b,c], [a,b,c], [g,h,i], [x,y,z] ]
或[ [a,b,c], [a,b,c], [c,d,e], [x,y,z] ]
。
要启动我已经注意到我的当前方法会在上面的第二种情况下吐出不需要的结果,例如[c,e,c,e]
,而不仅仅是[c,e]
。
通过使用数字来思考这个问题可能更容易:
var array = [
[2,n,4],
[4,n,6],
[6,n,8],
[8,n,10]
]
如果起始值为4
,我会将array[1][2]
或6
推送到container
,然后尝试匹配array[1][2]
或{{1到6
。因此,容器最终会成为array[i][0]
或2,4,6,8
或6,8
等序列。
答案 0 :(得分:1)
对于记录,这是@zerkms创建一个单独索引的意思,这是一个字母到字母的地图:
NegativeArraySizeException
&#13;
这个实现的优点在于,即使演示使用基元(字符串和数字),这也适用于非基元的嵌套数组,假设您正在测试对相同对象的引用而不是相同的副本。
答案 1 :(得分:0)
您也可以尝试这种方法:
function seq(source, result) {
if (source.length === 1)
return result.concat(source[0][source[0].length - 1]);
result = result || [];
if (source[0][source[0].length - 1] === source[1][0])
result = result.concat(source[1][0]);
return seq(source.slice(1), result);
}
console.log(seq(array));
答案 2 :(得分:-1)
for (var i = 1; i < array.length; i++) {
if (in_array(array[i][0], container)) { //if first element of current array matches any element in container
//add it to container if it's not already there
if (!in_array(array[i][2], container)) {
container.push(array[i][2]);
}
//and then recheck all arrays to see if they match the new element
i = 1;
}
}
答案 3 :(得分:-2)
对于每个数组,在
之前或之后查看是否有任何其他数组以此数组的最后一个值开头var container = [];
for (var i=0; i < ary.length; i++)
for (var j=0; j < ary.length; j++)
if (i != j && ary[i][2] == ary[j][0])
container.push(ary[j][0]);
如果您只是查看后面的子数组,那么只需在下一个索引
处启动内部循环var container = [];
for (var i=0; i < ary.length; i++)
for (var j=i+1; j < ary.length; j++)
if (i != j && ary[i][2] == ary[j][0])
container.push(ary[j][0]);