2

2つのオブジェクトのキーを比較しようとしていますが、プロパティの値は関係ありません。

var obj1 = {
    foo: {
        abc: "foo.abc",
    },
    bar: {
        aaa: {
            bbb: "bar.aaa.bbb" // <-- difference
        }
    }
};

var obj2 = {
    foo: {
        abc: "foo.abc",
    },
    bar: {
        aaa: {
            ccc: "bar.aaa.ccc" // <-- difference
        }
    }
};
// function should return true if properties are identical, false otherwise
function compareObjProps(obj1, obj2) {
    for(var prop in obj1) {

        // when comparing bar.aaa.bbb and bar.aaa.ccc
        // this does get logged, but the function doesn't return false
        if(!obj2.hasOwnProperty(prop)) {
            console.log("mismatch found");
            return false;
        }

        if(typeof(obj1[prop]) === "object") {
            compareObjProps(obj1[prop], obj2[prop]);
        }
    }

    // this always returns
    return true;
}

return falseトップレベルの関数からは戻らないようですが、再帰的な関数です。

では、マッチング関数全体の実行が完了したときに、どうすればfalseを返すことができますか?

4

3 に答える 3

4

リターンがありません:

    if(typeof(obj1[prop]) === "object"
        && !compareObjProps(obj1[prop], obj2[prop]))
    {
       return false;
    }

そうしないと、再帰呼び出しの結果は完全に無視されます。

于 2013-02-15T06:43:52.023 に答える
2

これを試して:

function compareObjProps(obj1, obj2) {
    var result = true;
    for (var prop in obj1) {
        if (obj1.hasOwnProperty(prop) && !obj2.hasOwnProperty(prop)) {
            console.log("mismatch found");
            result = false;
        } else if (typeof(obj1[prop]) === "object") {
            result = compareObjProps(obj1[prop], obj2[prop]);
        }

        if (!result) {
            break;
        }
    }

    return result;
}

http://jsfiddle.net/gSYfy/4/

于 2013-02-15T06:53:13.693 に答える
0

はい、関数 B によって呼び出された関数 A は、B に戻るように指示できません。一部の人々は、再帰呼び出しの結果を返すことを提案しましたが、それでは正しい結果が得られません。最初に見つかったサブオブジェクトが同一であるかどうかをプログラムが返すことになり、すべてのオブジェクトが同一である場合ではありません。 . この変更を行うことをお勧めします:

if(typeof(obj1[prop]) === "object") {
   if(!compareObjProps(obj1[prop], obj2[prop])){
      return false;
   }
}

これにより、プログラムは必要に応じて「偽」を伝播しますが、結果が「真」の場合は続行します。

于 2013-02-15T06:52:41.740 に答える