2012-09-19 109 views
0

我的編碼日不好。我根本不明白爲什麼this code on fiddle沒有達到我期望的效果。Javascript confusion:對象與數組還是對象數組?

var masterList = new Array(); 
var templates = new Array(); 
templates.push({"name":"name 1", "value":"1234"}); 
templates.push({"name":"name 2", "value":"2345"}); 
templates.push({"name":"name 3", "value":"3456"}); 
templates.push({"name":"name 4", "value":"4567"}); 
templates.push({"name":"name 1", "value":"5678"}); 
templates.push({"name":"name 2", "value":"6789"}); 
templates.push({"name":"name 3", "value":"7890"}); 
templates.push({"name":"name 4", "value":"8901"}); 


var addUnique = function(thatObj) { 
    var newList = new Array(); 

    if (masterList.length == 0) { 
     // add the first element and return 
     masterList.push(thatObj); 
     return; 
    } 

    for (j=0; j<masterList.length; j++) { 
     if (masterList[j].name != thatObj.name) { 
      newList.push(thatObj); 
     } 
    } 

    // store the new master list 
    masterList = newList.splice(0); 
} 

for (i=0; i<8; i++) { 
    addUnique(templates[i]); 
} 

console.log(masterList); 
console.log(masterList.length); 

在我(謙虛)看來,它應該通過模板陣列,填補了templateArray的每個元素的masterList,但只造成主陣列中的4個元素,因爲這被命名爲相同的那些應該被「覆蓋」,即不復制到中間數組中,因此不會被繼承和替換。相反,我在masterList中獲得一個條目。

哪裏有美好的過去,強類型的語言。指針。嘆。我只是沒有得到什麼樣的混亂JavaScript正在做(當然,我正在混亂當然),但我責備JS不理解我...

回答

2

newList的作用範圍是addUnique功能,調用8次循環。每次運行此函數時,都會爲masterList(masterList = newList.splice(0);)指定一個新值,因此只有最後一個值出現在console.log(masterList)中。

這是你撥弄了固定的版本:http://jsfiddle.net/vZNKb/2/

var addUnique = function(thatObj) { 
    if (masterList.length == 0) { 
     // add the first element and return 
     masterList.push(thatObj); 
     return; 
    } 

    var exists = false; 
    for (var j = 0; j < masterList.length; j++) { 
     if (masterList[j].name == thatObj.name) { 
      exists = true; 
      break; 
     } 
    } 

    if (!exists) { 
     masterList.push(thatObj); 
    } 
} 
0

你的循環在addUnique需要先遍歷所有的元素......然後添加如果沒有的元素匹配

相關部門

var matchingRecord = false; 
for(j=0;j<masterList.length;j++) { 
    if (masterList[j].name == thatObj.name){ 
     matchingRecord = true; 
     break; 
    } 
} 
if(!matchingRecord) newList.push(thatObj);