1

多次元オブジェクトをループして、キーが別のオブジェクトに存在するかどうかをテストする再帰関数を作成しようとしています。キーが存在しない場合はループを解除してfalseを返し、すべてのキーが存在する場合はtrueを返します。

私が抱えている問題は、関数が常にtrueを返しているように見えることです。これが私が使用しているコードです:

var properties = {'global': {'structure' : {'body': {}}}};

var testExists = {'global': {'structure': {'test': 'value'}}};

if( ! this.exists(properties, testExists)) {
   console.log("DOESNT EXIST");
}


exists: function(destination, source) {
    var exists = true;

    check:
    for (var property in source) {

        if(destination[property]) {
            arguments.callee(destination[property], source[property]);
        }
        else
        {
            exists = false;
            break check;
        }
    }

    console.log(exists);

    return exists;
},

コンソールを表示して「exists」の値を確認すると、最初のfalseと2番目のtrueの2行が表示されるため、作成している再帰にエラーがあるはずです。

4

2 に答える 2

1

問題は、再帰的に呼び出された関数の結果を使用しないことのようです。

また、を使用するarguments.calleeのではなく、関数名を使用する必要があります。また、プロパティを列挙する前に、パラメータがオブジェクトであるかどうかを確認する可能性があります。destinationまた、列挙されていないプロパティも確認することをお勧めしますsource

これを試して:

function equal(destination, source) {
    if (Object(destination)!==destination || Object(source)!==source)
        // at least one of them is a primitive value
        return destination == source; // maybe use strict equality === ?
    for (var prop in source)
        if (!(prop in destination) || !equal(source[prop], destination[prop]))
            return false;
    return true;
}
于 2012-10-01T10:56:26.867 に答える
1

あなたはそれを必要以上に複雑にしている:

function exists(destination, source) {
    for (var property in source) {
        if(destination.hasOwnProperty(property)) {
            if (!exists(destination[property], source[property])) {
                return false;
            }
        } else {
            return false;
        }
    }

    return true;
}​

.hasOwnPropertyは、オブジェクトの直接のプロパティのみを比較し、プロトタイプから継承されたプロパティは比較しないことを意味することに注意してください。これがあなたが探していたものだと思いました。

また、注意:再帰呼び出しの結果を実際に使用し、適切に再帰し、偽りをチェックするだけでなく.hasOwnPropertyを使用し、結果を格納するために中間変数を使用しません(再帰では機能しません)。とにかく、あなたはそれらを使用していました)。

もう1つ、これは「一方向」にのみ実行されます。つまり、ソースにない宛先のプロパティはチェックされません。両方の方法を確認するには、2回呼び出すか、両方をループするように拡張する必要があります。

于 2012-10-01T10:57:46.610 に答える