0

我有一个糟糕的编码日。我根本不明白为什么小提琴上的这段代码没有达到我的预期。

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);

在我的(谦虚)看来,它应该通过模板数组,用模板数组的每个元素填充 masterList,但只会在主数组中产生 4 个元素,因为命名相同的元素应该被“覆盖”,即没有复制到中间数组中,因此没有进行并用新的替换。相反,我在 masterList 中获得了一个条目。

过去的美好时光,强类型语言都去哪儿了。指针。叹。我只是不明白 javascript 正在制造什么样的混乱(好吧,我当然是在制造混乱)但我责怪 JS 不理解我......

4

2 回答 2

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);
    }
}
于 2012-09-19T12:41:40.827 回答
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);
于 2012-09-19T12:41:24.567 回答