7

オブジェクトにいくつかのプロパティがあるかどうかを調べようとしていますが、hasOwnProperty メソッドの使用に問題があります。

私は配列でメソッドを使用しています(ドキュメントに文字列が記載されていることは知っています)。

次の行は true を返します。

{ "a": 1, "b": 2 }.hasOwnProperty( ["a"]);

この行も true を返します。

{ "a": 1, "b": 2 }.hasOwnProperty( "a", "b");

しかし、これは false を返します:

{ "a": 1, "b": 2 }.hasOwnProperty( ["a", "b"])

そして、私はそれが真を返す必要があります。使用しているプロパティを取得するために Object.keys(object) を使用しています。配列が返されるため、hasOWnProperty で配列を使用する必要があります。

私が見逃している理論的な概念はありますか?そして、この問題を解決する方法はありますか?

4

6 に答える 6

17

ここでは 2 つのことが行われています。

まず、hasOwnProperty1 つの引数のみを取ります。したがって、他の引数を渡しても無視されます。

次に (ここでは少し単純化しています)、最初の引数をStringに変換し、オブジェクトにそのプロパティがあるかどうか確認します。

それでは、テスト ケースを見てみましょう。

{ "a": 1, "b": 2 }.hasOwnProperty( "a", "b");返さtrueれる理由は、2 番目の引数を無視しているためです。つまり、実際には「a」をチェックしているだけです。

{ "a": 1, "b": 2 }.hasOwnProperty( ["a", "b"])が返さfalseれるのは、最初の引数["a", "b"]が に変換され"a,b"、 がないため{ "a": 1, "b": 2 }["a,b"]です。

特定のオブジェクトが配列内のすべてのプロパティを持っているかどうかを調べるには、次のように、配列をループして各プロパティを確認できます。

function hasAllProperties(obj, props) {
    for (var i = 0; i < props.length; i++) {
        if (!obj.hasOwnProperty(props[i]))
            return false;
    }
    return true;
}

または、気の利いた場合は、every関数を使用してこれを暗黙的に行うことができます。

var props = ["a", "b"];
var obj = { "a": 1, "b": 2 };
var hasAll = props.every(prop => obj.hasOwnProperty(prop));

それが物事を明確にするのに役立つことを願っています。幸運を!

于 2018-02-06T23:40:12.100 に答える
2

ドキュメントを考えると、hasOwnProperty()メソッドは文字列またはシンボルを引数として取るようです。hasOwnProperty()したがって、文字列のコレクションを取得して、オブジェクトがそれぞれをプロパティとして持っているかどうかをテストすることはできないと思います。

別のアプローチは、文字列の配列を取得して、それぞれを反復処理することだと思います。次に、配列内の各文字列 (テストするプロパティ) について、オブジェクトにそのプロパティがあるかどうかをテストできます。次に例を示します。

const o = new Object();
var propsToTest = ['a', 'b'];
o.a = 42;
o.b = 40;

var hasProperties = true;
propsToTest.forEach(function(element) {	// For each "property" in propsToTest, verify that o hasOwnProperty
  if(!o.hasOwnProperty(element))
    hasProperties = false;
});

console.log(hasProperties);

于 2018-02-06T23:39:54.597 に答える