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.thePropertytrue以外のすべてを返しfalseますthePropertyobjの' 'は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の他の使用を確認してください