我尝试使用while循环遍历列,但每次我都收到错误,我想知道你们是否可以告诉我我做错了什么。 代码是这样的:
var arr = [
[['cat', 'fish'],['dog', 'meat']],
[['cat', 'toy'],['dog', 'bone']],
[['cat', 'fish'],['dog', 'bone']]
];
var position = 0;
//can I do this in stead?
//while(arr.length > position){
while(true){
var arrEnd = true;
for (var k = 0; k < arr.length; k++) {
if(arr.length > position){
arrEnd = false;
}
}
if(arrEnd){break;}
for(var i =0; i < arr.length;i++){
for(var j =0; j < arr.length;j++){
if(i != j && arr[i][position][1] == arr[j][position][1]){
console.log(arr[i][position]+'===='+arr[j][position]);
}
}
}
position++;
}
//Expected:
// "cat,fish====cat,fish" "cat,fish====cat,fish"
// "dog, bone====dog,bone" "dog, bone====dog,bone"
//Error getting: arr[i][position] is undefined
有什么问题?我无法看到这个问题。
答案 0 :(得分:1)
你有一个三维数组。您最初对数组的第一个索引使用position
,然后在发生错误的地方使用position
来引用第二个索引。由于第一个维度比第二个维度长,因此最终会因为未定义请求索引的值而导致错误。
假设每个级别的内部数组长度相等,则可以:
var arr = [
[['cat', 'fish'],['dog', 'meat']],
[['cat', 'toy'],['dog', 'bone']],
[['cat', 'fish'],['dog', 'bone']]
];
var position = 0;
while(true){
var arrEnd = true;
for (var k = 0; k < arr[0].length; k++) {
if(arr[0].length > position){
arrEnd = false;
}
}
if(arrEnd){break;}
for(var i =0; i < arr.length;i++){
for(var j =0; j < arr.length;j++){
if(i != j && arr[i][position][1] == arr[j][position][1]){
console.log(arr[i][position]+'===='+arr[j][position]);
}
}
}
position++;
}
请注意第一个[0]
循环中的其他for
。
但是,实际上,应该重新安排代码以更清楚地说明发生了什么,以便更容易看到这样的问题:
var arr = [
[['cat', 'fish'],['dog', 'meat']],
[['cat', 'toy'],['dog', 'bone']],
[['cat', 'fish'],['dog', 'bone']]
];
for(var i=0; i < arr.length-1; i++){
for(var j=i+1; j < arr.length; j++){
for(var k=0; k < arr[i].length; k++){
if(arr[i][k][1] == arr[j][k][1]) {
console.log(arr[i][k]+'===='+arr[j][k]);
}
}
}
}
答案 1 :(得分:0)
您的问题出在rect
之外的while (true)
和position++
。最终,for
将大于1,从而导致您收到的确切错误。
还有一点需要注意,position
的长度为3,而最大位置数(第二维索引)为1(因为您的子阵列中有2个数组)。
请尝试使用Array.prototype.forEach
。
arr
循环