2012-03-22 49 views
0

前几天我发布了一个线程,询问如何在传递方法2的JS数组时找到缺失的元素。正如你可以看到here。我一直在想现在就弄清楚如何使强似这2个数组传递给它2二维数组......遇到了一些麻烦,虽然修改方法:通过比较Javascript中的2个二维数组找到缺失的元素

/*var sml = new Array(); 
sml[0] = new Array("dean","22"); 
sml[1] = new Array("james","31"); 
sml[2] = new Array("ludwig","35"); 

var lrg = new Array(); 
lrg[0] = new Array("dean","22"); 
lrg[1] = new Array("james","31"); 
lrg[2] = new Array("ludwig","35"); 
lrg[3] = new Array("kevin","23"); 
lrg[4] = new Array("elton","40");*/ 

var sml = new Array(); 
sml[0] = "dean"; 
sml[1] = "james"; 
sml[2] = "ludwig"; 

var lrg = new Array(); 
lrg[0] = "dean"; 
lrg[1] = "james"; 
lrg[2] = "ludwig"; 
lrg[3] = "kevin"; 
lrg[4] = "elton"; 


var deselected = findDeselectedItem(sml, lrg); 

alert("Deselected Items: " + deselected[0]+", "+ deselected[1]); 

// -------------------------------------------------------------- // 

function findDeselectedItem(CurrentArray, PreviousArray) { 


var CurrentArrSize = CurrentArray.length; 
var PreviousArrSize = PreviousArray.length; 
var deselectedItems = new Array(); 

// loop through previous array 
for (var j = 0; j < PreviousArrSize; j++) { 

    // look for same thing in new array 
    if (CurrentArray.indexOf(PreviousArray[j]) == -1) 

    deselectedItems.push(PreviousArray[j]); 

} 

if (deselectedItems.length != 0) { 
    return deselectedItems; 
} else { 
    return null; 
} 

}​ 

现在,如果你运行上面代码它完美的工作,但如果你去取消顶部的变量声明,将数组放在数组的顶部,然后注释掉在数组顶部的简单字符串,它不会工作。 。例如:

var sml = new Array(); 
sml[0] = new Array("dean","22"); 
sml[1] = new Array("james","31"); 
sml[2] = new Array("ludwig","35"); 

var lrg = new Array(); 
lrg[0] = new Array("dean","22"); 
lrg[1] = new Array("james","31"); 
lrg[2] = new Array("ludwig","35"); 
lrg[3] = new Array("kevin","23"); 
lrg[4] = new Array("elton","40"); 

/*var sml = new Array(); 
sml[0] = "dean"; 
sml[1] = "james"; 
sml[2] = "ludwig"; 

var lrg = new Array(); 
lrg[0] = "dean"; 
lrg[1] = "james"; 
lrg[2] = "ludwig"; 
lrg[3] = "kevin"; 
lrg[4] = "elton";*/ 


var deselected = findDeselectedItem(sml, lrg); 

alert("Deselected Items: " + deselected[0]+", "+ deselected[1]); 

// -------------------------------------------------------------- // 

function findDeselectedItem(CurrentArray, PreviousArray) { 


var CurrentArrSize = CurrentArray.length; 
var PreviousArrSize = PreviousArray.length; 
var deselectedItems = new Array(); 

// loop through previous array 
for (var j = 0; j < PreviousArrSize; j++) { 

    // look for same thing in new array 
    if (CurrentArray.indexOf(PreviousArray[j][0]) == -1) 

    deselectedItems.push(PreviousArray[j][0]); 

} 

if (deselectedItems.length != 0) { 
    return deselectedItems; 
} else { 
    return null; 
} 

}​ 

该方法返回2个完全错误的值。 PS - 我对“数字”还没有兴趣,只是目前的“名称”...

回答

1

你也可以重新排列是这样的:

var sml = {}; 
sml["dean"] = 22; 
sml["james"] = 31; 
sml["ludwig"] = 35; 

var lrg = {}; 
lrg["dean"] = 22; 
lrg["james"] = 31; 
lrg["ludwig"] = 35; 
lrg["kevin"] = 23; 
lrg["elton"] = 40; 

及用途:

function findDeselectedItem(c,p){ 
    ret=[]; 
    for (var i in p){ 
     if (p.hasOwnProperty(i)){ 
      if ('undefined'===typeof c[i]) { 
       ret.push(i); 
      } 
     } 
    } 
    return ret; 
} 


alert(findDeselectedItem(sml, lrg)); 

演示:http://jsfiddle.net/LsrCj/

+0

你的解决方案效果很好stewe,不幸的是,虽然我将在该方法中接收数组的格式是:var lrg = new Array(); lrg [0] = new Array(“dean”,“22”);等等...需要使该功能与输入一起工作,而不是相反。 – Tiwaz89 2012-03-22 08:36:46

+0

下面是一个例子,使用你的数组格式:http://jsfiddle.net/mka9R/ – stewe 2012-03-22 08:44:40

+0

太棒了!非常感谢你。 – Tiwaz89 2012-03-22 08:49:38

2

您的CurrentArray是二维的,indexOf比较数组,但不是该数组的第一个元素。所以,你需要使用:

for (var i = 0; i < CurrentArray.length; ++i){ 
    if (CurrentArray[i][0] == PreviousArray[j][0]){ 
     deselectedItems.push(PreviousArray[j][0]); 
     break; 
    } 
} 

而不是

if (CurrentArray.indexOf(PreviousArray[j][0]) == -1) 
    deselectedItems.push(PreviousArray[j][0]); 
+0

嗨user1113426,我试了一下你的建议和功能仍返回它在mod之前所做的2个值? (我确实在你的if语句中修复了'==='问题) – Tiwaz89 2012-03-22 08:15:48

+0

现在工作吗? – Engineer 2012-03-22 08:18:14

1

indexOf功能将检查在这种情况下,对象平等;为了让它返回比-1更多的东西,你必须将相同的二维数组实例传递给sml和lrg。

new Array("dean","22") === new Array("dean","22") //false 

保持相同的情况下(例如http://jsfiddle.net/3TQYz/)在两个数组或使用自己的indexOf测试将递归检查数组的值,使你的案子。

+0

感谢Valentin的回复,对于我来说,使用与你建议的相同的实例是不可能的。我使用自己的indexOf测试会更适合我的情况。你如何/在哪里将它应用于代码中? – Tiwaz89 2012-03-22 08:30:38

+0

如果只有你可以使用像这样的东西:if(CurrentArray [i] [0] .equals(PreviousArray [j] [0]))像在Java ...叹息 – Tiwaz89 2012-03-22 08:45:48

+0

http://jsfiddle.net/bnJUK/ – 2012-03-22 09:41:39