特定のキーが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
、keyがundefined
の各メソッドのパフォーマンス比較については、 ベンチマーク を参照してください。
それは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
演算子 on Array を使用してデータを検索するように注意してください。
("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)
配列内の既存の要素をテストするには: 項目がJavaScriptの配列内にあるかどうかを調べる最も良い方法は?
"key" in obj
配列キーとは非常に異なるオブジェクト属性値のみをテストする可能性があります。
プロパティがJavaScriptオブジェクトに存在するかどうかを確認する3つの方法:
参照:
underscore.js libraryを使用している場合は、オブジェクト/配列操作が簡単になります。
あなたの場合は_.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)
は、オブジェクトや配列内のキーを簡単に検索するために使用できます。
検索したいキーを渡し、検索したいオブジェクト(オブジェクトまたは配列)を検索してください。
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;
}
keyExists('Apple', ['Apple', 'banana', 'orange']); // true
keyExists('fruit', ['Apple', 'banana', 'orange']); // false
オブジェクト内のキーを検索する
keyExists('age', {'name': 'Bill', 'age': 29 }); // true
keyExists('title', {'name': 'Jason', 'age': 29 }); // 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');
一行の例です。
console.log(Object.keys({foo: 'one', bar: 'two'}).some(v => v == 'foo'));
バニラjs
yourObjName.hasOwnProperty(key) : true ? false;
オブジェクトにes2015で少なくとも1つのプロパティがあるかどうかを確認する場合
Object.keys(yourObjName).length : true ? false
hasOwnProperty.call(obj, key);
underscore.js way -
if(_.has(this.options, 'login')){
//key 'login' exists in this.options
}
_.has = function(obj, key) {
return hasOwnProperty.call(obj, key);
};
これは古い質問ですが、答えを出すのを遅らせることは決してないと思います。
オブジェクト "products"と2つのアイテムがあるとします。このオブジェクトにidが既に存在するかどうかを確認したい場合は、find()を使用できます。
products = [
{
"id": 1,
"name": "Name 1"
},
{
"id": 2,
"name": "Name 2"
},
]
item1 =
{
"id": 3,
"name": "Name 3",
}
item2 =
{
"id": 1,
"name": "Name 1",
}
if(products.find(x => x.id === item1.id)){
console.log('id is in products');
}else {
console.log('id is not in products');
}
if(products.find(x => x.id === item2.id)){
console.log('id is in products');
}else {
console.log('id is not in products');
}
ログ:
id is not in products
id is in products
確認する最も簡単な方法は
"key" in object
例えば:
var obj = {
a: 1,
b: 2,
}
"a" in obj // true
"c" in obj // false
戻り値 true は、そのキーがオブジェクト内に存在することを意味します。
これは必ずキーが存在するかどうかをチェックしますが、値の真偽をチェックします。 undefined
とnull
のどちらが該当します。
Boolean(obj.foo)
TypeScriptを使用していて、キーが存在するかどうかを確認するのに'foo' in obj
やobj.hasOwnProperty('foo')
のような文字列を使用しているので、この解決法は私には最適です。
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>
これはそのキー、しかし deep が定義されているかどうかを効果的にチェックし、そのキーが定義されていないとnot notはあなたのプログラムの流れを損なうかもしれません。
これらの例は、さまざまな方法の違いを実証することができます。あなたのニーズに合ったものを選ぶのに役立つことを願っています:
// 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"]
オブジェクト上の任意の深さにあるキーを調べ、誤った値を考慮したい場合は、この行を効用関数として考えてください。
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
yourArray.indexOf(yourArrayKeyName)> -1
fruit = ['Apple', 'grapes', 'banana']
fruit.indexOf('Apple') > -1
true
fruit = ['Apple', 'grapes', 'banana']
fruit.indexOf('Apple1') > -1
false
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の使用
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';