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 を templateArray の各要素で埋める必要がありますが、同じ名前の要素は「上書き」する必要があるため、マスター配列には 4 つの要素しかありません。中間配列にコピーされないため、実行されず、新しい配列に置き換えられます。代わりに、masterList に 1 つのエントリを取得します。

古き良き時代、強く型付けされた言語はどこへ行ってしまったのでしょう。ポインター。はぁ。私はJavaScriptがどのような混乱を引き起こしているのかわかりませんが(もちろん、私は混乱を引き起こしています)、JSが私を理解していないことを非難しています...

4

2 に答える 2

2

newListaddUniqueループ内で 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 に答える