JavaScriptオブジェクトまたは配列に特定のキーが存在するかどうかを確認するにはどうすればよいですか?
キーが存在せず、アクセスしようとすると、falseが返されますか?またはエラーをスローしますか?
未定義をチェックすることは、キーが存在するかどうかをテストする正確な方法ではありません。キーは存在するが、値が実際にある場合は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
プロパティ値の初期化に使用します。それ以外の場合は、slowin
演算子またはhasOwnProperty()
メソッドを使用します。
人々がコメントしているように、Javascriptエンジンの最新バージョン(Firefoxを除く)は、アクセスプロパティのアプローチを変更しました。この特定のケースでは、現在の実装は前の実装よりも低速ですが、アクセスキーとオブジェクトの違いは無視できます。
戻り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
}
受け入れ答えはを参照するオブジェクト。キーの代わりにデータを検索するために配列の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
' in objobj.hasOwnProperty('theProperty')
toString
メソッドがあるため、1と2はtrueを返し、3はfalseを返すことができます。)参照:
http://book.mixu.net/node/ch5.html
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
それはかなり信頼性が高く、クロスブラウザでうまく機能します。
バニラjs
yourObjName.hasOwnProperty(key) : true ? false;
オブジェクトにes2015で少なくとも1つのプロパティがあるかどうかを確認する場合
Object.keys(yourObjName).length : true ? false
とを使用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);
underscore.js道-
if(_.has(this.options, 'login')){
//key 'login' exists in this.options
}
_.has = function(obj, key) {
return hasOwnProperty.call(obj, key);
};
確認する最も簡単な方法は
"key" in object
例えば:
var obj = {
a: 1,
b: 2,
}
"a" in obj // true
"c" in obj // false
trueとしての戻り値は、キーがオブジェクトに存在することを意味します。
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
これは必ずしもキーが存在するかどうかをチェックするわけではありませんが、値の真実性をチェックします。どちらundefined
にnull
該当します。
Boolean(obj.foo)
私はtypescriptを使用しており、そのような文字列を使用し'foo' in obj
たりobj.hasOwnProperty('foo')
、キーが存在するかどうかを確認したりしても、インテリセンスが得られないため、このソリューションは私にとって最適です。
const object1 = {
a: 'something',
b: 'something',
c: 'something'
};
const key = 's';
// Object.keys(object1) will return array of the object keys ['a', 'b', 'c']
Object.keys(object1).indexOf(key) === -1 ? 'the key is not there' : 'yep the key is exist';
「配列」の世界では、インデックスをある種のキーと見なすことができます。驚くべきことに、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]);
yourArray.indexOf(yourArrayKeyName)> -1
fruit = ['apple', 'grapes', 'banana']
fruit.indexOf('apple') > -1
true
fruit = ['apple', 'grapes', 'banana']
fruit.indexOf('apple1') > -1
false
これらの例は、さまざまな方法の違いを示すことができます。それがあなたのニーズに合ったものを選ぶのに役立つことを願っています:
// 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"]
速くて簡単な解決策は、オブジェクトをjsonに変換することです。そうすれば、この簡単なタスクを実行できるようになります。
const allowed = {
'/login' : '',
'/register': '',
'/resetpsw': ''
};
console.log('/login' in allowed); //returns true
配列を使用する場合、オブジェクトキーは0、1、2、3などの整数に変換されるため、常にfalseになります。
Reba McEntire が息子の Shelby Blackstock と共有しているクリスマスの伝統について学びましょう。
メーガン・マークルとマライア・キャリーが自然な髪の上でどのように結合したかについて、メーガンの「アーキタイプ」ポッドキャストのエピソードで学びましょう.
ハリー王子が家族、特にチャールズ王とウィリアム王子との関係について望んでいると主張したある情報源を発見してください。
ワイノナ・ジャッドが、母親のナオミ・ジャッドが亡くなってから初めての感謝祭のお祝いを主催しているときに、彼女が今では家長であることをどのように認識したかを学びましょう.
Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?
The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!
爪| $ 15 | マルボロ&ケインザクロー| $ 15 | Malboro&Kane世界最小のマルチツールであるTheClawをたった15ドルで手に入れましょう。男の子と一緒に冷たいものを割って開けたり、ネジを締めたり、Amazonパッケージを細断したりする場合でも、この悪い男の子はこれまでで最も便利な製品の1つです。
人が2つのマッチを接着するように導くものは何ですか?何があなたをマッチに打ち続け、構造が湾曲していることを発見するのですか?42,000のボールを作るまで、試合を続けなければならない理由は何ですか?しかし、何よりも、これほど魅力的なショーである可能性はどのようにありますか?私はあなたをだますつもりはありません、次に私たちがあなたに残すのは、あなたや私のような人が自由な時間を過ごすことを決定するビデオですボールを作るために必要な試合数を確認します(答えは42です。
写真:AP先月、カリフォルニアの地元新聞が1,900万件以上の有権者記録をオンラインで公開しました。Gizmodoは今週、明らかなランサムウェア攻撃中にレコードが侵害されたことを確認しました。
ロシアのフィギュアスケーター、カミラ・バリエバが関与したドーピング事件が整理されているため、チームは2022年北京冬季オリンピックで獲得したメダルを待っています。
何千人ものAmazonの買い物客がMulberry Silk Pillowcaseを推奨しており、現在販売中. シルクの枕カバーにはいくつかの色があり、髪を柔らかく肌を透明に保ちます。Amazonで最大46%オフになっている間にシルクの枕カバーを購入してください
ラファイエット警察署は、「不審な男性が女性に近づいた」という複数の苦情を受けて、12 月にパデュー大学の教授の捜査を開始しました。
私たちの周りの世界と同じように、言語は常に変化しています。以前の時代では、言語の変化は数年または数十年にわたって発生していましたが、現在では数日または数時間で変化する可能性があります。
認知症を患っている 91 歳のアジア人女性が最近、47 番街のアウター サンセット地区でロメオ ロレンゾ パーハムに襲われました。伝えられるところによると、被害者はサンフランシスコの通りを歩いていたところ、容疑者に近づき、攻撃を受け、暴行を受けました。
“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.
人々にチャンスを与えることは、人生で少し遅すぎると私は信じています。寛大に。