2012-03-22 129 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