JavaScriptオブジェクトまたは配列に特定のキーが存在するかどうかを確認するにはどうすればよいですか?
キーが存在しない場合にアクセスしようとすると、falseが返されますか?またはエラーをスローしますか?
property.key = property.key || 'some default value'
、そのキーに何らかの値を付けて存在させたい場合に備えて
JavaScriptオブジェクトまたは配列に特定のキーが存在するかどうかを確認するにはどうすればよいですか?
キーが存在しない場合にアクセスしようとすると、falseが返されますか?またはエラーをスローしますか?
property.key = property.key || 'some default value'
、そのキーに何らかの値を付けて存在させたい場合に備えて
回答:
undefined-nessのチェックは、キーが存在するかどうかをテストする正確な方法ではありません。キーは存在するが値が実際にある場合はundefined
どうなりますか?
var obj = { key: undefined };
obj["key"] !== undefined // false, but the key exists!
代わりにin
演算子を使用する必要があります:
"key" in obj // true, regardless of the actual value
キーが存在しないかどうかを確認する場合は、かっこを使用してください。
!("key" in obj) // true if "key" doesn't exist in object
!"key" in obj // ERROR! Equivalent to "false in obj"
または、特に継承されたプロパティではなく、オブジェクトインスタンスのプロパティをテストする場合は、次を使用しますhasOwnProperty
。
obj.hasOwnProperty("key") // true
ある方法との性能比較のためにin
、hasOwnProperty
そしてキーがありundefined
、この参照のベンチマークを
JavaScriptオブジェクトまたは配列に特定のキーが存在するかどうかを確認するにはどうすればよいですか?キーが存在せず、アクセスしようとすると、falseが返されますか?またはエラーをスローしますか?
(連想)配列スタイルまたはオブジェクトスタイルを使用して欠落しているプロパティに直接アクセスすると、未定義の定数が返されます。
既にここで説明したように、「未定義」定数に関連付けられたプロパティを持つオブジェクトを作成できます。
var bizzareObj = {valid_key: undefined};
その場合、hasOwnPropertyまたはin演算子を使用して、キーが実際に存在するかどうかを確認する必要があります。しかし、しかし、どのような価格で?
だから、私はあなたに言います...
in演算子とhasOwnPropertyは、Javascriptのプロパティ記述子メカニズムを使用する「メソッド」です(Java言語のJavaリフレクションと同様)。
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
プロパティ記述子タイプは、名前付きプロパティ属性の操作と具体化を説明するために使用されます。プロパティ記述子タイプの値は、名前付きフィールドで構成されるレコードであり、各フィールドの名前は属性名であり、その値は8.6.1で指定されている対応する属性値です。さらに、任意のフィールドが存在する場合と存在しない場合があります。
一方、オブジェクトのメソッドまたはキーを呼び出すと、Javascript [[Get]]メカニズムが使用されます。それははるかに速いです!
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
。
使用中にオペレータvar result = "Impression" in array;
結果は
12,931,832 ±0.21% ops/sec 92% slower
hasOwnPropertyの使用
var result = array.hasOwnProperty("Impression")
結果は
16,021,758 ±0.45% ops/sec 91% slower
要素に直接アクセスする(角括弧スタイル)
var result = array["Impression"] === undefined
結果は
168,270,439 ±0.13 ops/sec 0.02% slower
要素に直接アクセスする(オブジェクトスタイル)
var result = array.Impression === undefined;
結果は
168,303,172 ±0.20% fastest
undefined
値を割り当てる理由は何ですか?その質問は私を困惑させます。JavaScriptでは、このような問題を回避するために、存在しないオブジェクトには少なくとも2つの参照がnull
ありundefined
ます。
null
オブジェクト値の意図的な欠如、または短期的には、値の確認された欠如を表すプリミティブ値です。一方、undefined
は不明な値です(定義されていません)。後で適切な値で使用されるプロパティがある場合は、最初の瞬間にプロパティに値がないことが確認されるため、null
代わりに参照の使用を検討してください。undefined
比較:
var a = {1: null};
console.log(a[1] === undefined); // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.: the value is defined.
console.log(a[0] === undefined); // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].
undefined
値を持つオブジェクトは避けてください。可能な限り直接確認し、null
プロパティ値の初期化に使用します。それ以外の場合は、slow in
演算子またはhasOwnProperty()
メソッドを使用します。
人々がコメントしたように、JavaScriptエンジンの最新バージョン(Firefoxを除く)は、アクセスプロパティのアプローチを変更しました。この特定のケースでは、現在の実装は以前の実装よりも低速ですが、アクセスキーとオブジェクトの違いは無視できます。
delete hash[key]
が、よりもはるかに遅いため hash[key] = undefined
です。もちろん、この場合、in
演算子を必要とすることは意味がありませんが、「値を未定義に設定することは常に避ける必要があります」の反例として機能します。
戻りundefined
ます。
var aa = {hello: "world"};
alert( aa["hello"] ); // popup box with "world"
alert( aa["goodbye"] ); // popup box with "undefined"
undefined
特別な定数値です。たとえば、次のように言うことができます
// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
// do something
}
これはおそらく、欠落したキーをチェックするための最良の方法です。ただし、以下のコメントで指摘されているように、実際の値をにすることは理論的には可能ですundefined
。私はこれを行う必要がなかったので、なぜ私がしたいのかという理由がわからないのですが、完全を期すために、in
演算子を使用することができます
// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
// do something
}
var undefined = 42;
。たとえば、未定義の小道具をテストするときは、常にを使用する必要があります((typeof variable) === "undefined")
。
受け入れ答えはを参照するオブジェクト。キーの代わりに配列のin
演算子を使用してデータを検索することに注意してください。
("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)
配列内の既存の要素をテストするには:アイテムがJavaScript配列内にあるかどうかを確認する最良の方法?
"key" in obj
配列キーとは非常に異なるオブジェクト属性値のみをテストしている可能性があります
プロパティがJavaScriptオブジェクトに存在するかどうかを確認する3つの方法:
!!obj.theProperty
true
以外のすべてを返しfalse
ますtheProperty
objの' 'はobj.hasOwnProperty('theProperty')
toString
メソッドを持っているので、1と2はtrueを返し、3はfalseを返すことができます。)参照:
var a = {a : undefined, b : null}; !!a.a **will return false**
!!obj.theProperty
オブジェクトは名前付きプロパティを持つかどうかを確認するための解決策ではありませんtheProperty
。これは、任意のfalseyプロパティ値のために失敗しundefined
、ヌル、数値0
やNaN
、空の文字列""
underscore.jsライブラリを使用している場合は、オブジェクト/配列の操作が簡単になります。
あなたの場合、_。hasメソッドを使用できます。例:
yourArray = {age: "10"}
_.has(yourArray, "age")
trueを返します
だが、
_.has(yourArray, "invalidKey")
falseを返します
回答:
if ("key" in myObj)
{
console.log("key exists!");
}
else
{
console.log("key doesn't exist!");
}
説明:
in
キーがオブジェクトに存在する場合にオペレータがチェックされます。値が未定義であるかどうかを確認した場合:値をif (myObj["key"] === 'undefined')
持つキーがオブジェクトに存在する可能性があるため、問題が発生する可能性がありundefined
ます。
そのため、最初にin
演算子を使用し、既に存在することがわかったら、キーの内部にある値を比較することをお勧めします。
これkeyExists(key, search)
は、オブジェクトまたは配列内のキーを簡単に検索するために使用できます。
検索したいキーを渡し、検索したいobj(オブジェクトまたは配列)を検索するだけです。
function keyExists(key, search) {
if (!search || (search.constructor !== Array && search.constructor !== Object)) {
return false;
}
for (var i = 0; i < search.length; i++) {
if (search[i] === key) {
return true;
}
}
return key in search;
}
// How to use it:
// Searching for keys in Arrays
console.log(keyExists('apple', ['apple', 'banana', 'orange'])); // true
console.log(keyExists('fruit', ['apple', 'banana', 'orange'])); // false
// Searching for keys in Objects
console.log(keyExists('age', {'name': 'Bill', 'age': 29 })); // true
console.log(keyExists('title', {'name': 'Jason', 'age': 29 })); // false
それはかなり信頼性が高く、クロスブラウザでうまく動作します。
Array.indexOf
メソッドを使用できるのに、なぜこのような配列を反復処理するのですか?(あなたが値を探しているなら、それはそれです)
とを使用Array#some
しObject.keys
ます。指定されたキーがオブジェクトに存在する場合はtrueを返し、存在しない場合はfalseを返します。
var obj = {foo: 'one', bar: 'two'};
function isKeyInObject(obj, key) {
var res = Object.keys(obj).some(v => v == key);
console.log(res);
}
isKeyInObject(obj, 'foo');
isKeyInObject(obj, 'something');
1行の例。
console.log(Object.keys({foo: 'one', bar: 'two'}).some(v => v == 'foo'));
hasOwnProperty.call(obj, key);
if(_.has(this.options, 'login')){
//key 'login' exists in this.options
}
_.has = function(obj, key) {
return hasOwnProperty.call(obj, key);
};
lodash
自分のプロジェクトに含ま:オブジェクトのパスの値を取得します。解決された値が未定義の場合、代わりにdefaultValueが返されます。
var object = { 'a': [{ 'b': { 'c': 3 } }] };
console.log(
_.get(object, 'a[0].b.c'), // => 3
_.get(object, ['a', '0', 'b', 'c']), // => 3
_.get(object, 'a.b.c'), // => undefined
_.get(object, 'a.b.c', 'default') // => 'default'
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
その鍵は、しかし、もしこれが効果的にチェックします深く、定義されておりません。そのキーが定義されていない場合は、プログラムの流れを害する可能性があるエラーをスローします。
オブジェクトの任意の深さでキーをチェックし、誤った値を考慮したい場合は、ユーティリティ関数について次の行を検討してください。
var keyExistsOn = (o, k) => k.split(".").reduce((a, c) => a.hasOwnProperty(c) ? a[c] || 1 : false, Object.assign({}, o)) === false ? false : true;
結果
var obj = {
test: "",
locals: {
test: "",
test2: false,
test3: NaN,
test4: 0,
test5: undefined,
auth: {
user: "hw"
}
}
}
keyExistsOn(obj, "")
> false
keyExistsOn(obj, "locals.test")
> true
keyExistsOn(obj, "locals.test2")
> true
keyExistsOn(obj, "locals.test3")
> true
keyExistsOn(obj, "locals.test4")
> true
keyExistsOn(obj, "locals.test5")
> true
keyExistsOn(obj, "sdsdf")
false
keyExistsOn(obj, "sdsdf.rtsd")
false
keyExistsOn(obj, "sdsdf.234d")
false
keyExistsOn(obj, "2134.sdsdf.234d")
false
keyExistsOn(obj, "locals")
true
keyExistsOn(obj, "locals.")
false
keyExistsOn(obj, "locals.auth")
true
keyExistsOn(obj, "locals.autht")
false
keyExistsOn(obj, "locals.auth.")
false
keyExistsOn(obj, "locals.auth.user")
true
keyExistsOn(obj, "locals.auth.userr")
false
keyExistsOn(obj, "locals.auth.user.")
false
keyExistsOn(obj, "locals.auth.user")
true
このNPMパッケージも参照してください:https : //www.npmjs.com/package/has-deep-value
「配列」の世界では、インデックスをある種のキーと見なすことができます。in
演算子の驚くべきこと(これはオブジェクトに適しています)も配列で機能します。存在しないキーの戻り値はundefined
let arr = ["a","b","c"]; // we have indexes: 0,1,2
delete arr[1]; // set 'empty' at index 1
arr.pop(); // remove last item
console.log(0 in arr, arr[0]);
console.log(1 in arr, arr[1]);
console.log(2 in arr, arr[2]);
これらの例は、さまざまな方法の違いを示しています。それがあなたのニーズに合ったものを選ぶのに役立つことを願っています:
// Lets create object `a` using create function `A`
function A(){};
A.prototype.onProtDef=2;
A.prototype.onProtUndef=undefined;
var a=new A();
a.ownProp = 3;
a.ownPropUndef = undefined;
// Let's try different methods:
a.onProtDef; // 2
a.onProtUndef; // undefined
a.ownProp; // 3
a.ownPropUndef; // undefined
a.whatEver; // undefined
a.valueOf; // ƒ valueOf() { [native code] }
a.hasOwnProperty('onProtDef'); // false
a.hasOwnProperty('onProtUndef'); // false
a.hasOwnProperty('ownProp'); // true
a.hasOwnProperty('ownPropUndef'); // true
a.hasOwnProperty('whatEver'); // false
a.hasOwnProperty('valueOf'); // false
'onProtDef' in a; // true
'onProtUndef' in a; // true
'ownProp' in a; // true
'ownPropUndef' in a; // true
'whatEver' in a; // false
'valueOf' in a; // true (on the prototype chain - Object.valueOf)
Object.keys(a); // ["ownProp", "ownPropUndef"]
JavaScript Destructuringによる新しい素晴らしいソリューション:
let obj = {
"key1": "value1",
"key2": "value2",
"key3": "value3",
};
let {key1, key2, key3, key4} = obj;
// key1 = "value1"
// key2 = "value2"
// key3 = "value3"
// key4 = undefined
// Can easily use `if` here on key4
if(!key4) { console.log("key not present"); } // Key not present
JavaScript Destructuringの他の使用を確認してください