javascript - एक जावास्क्रिप्ट ऑब्जेक्ट में कोई कुंजी मौजूद है या नहीं?




arrays object (17)

जावास्क्रिप्ट ऑब्जेक्ट या सरणी में कोई विशेष कुंजी मौजूद है या नहीं?

यदि कोई कुंजी मौजूद नहीं है, और मैं इसे एक्सेस करने का प्रयास करता हूं, तो क्या यह झूठी वापसी करेगा? या एक त्रुटि फेंक दो?


Answers

वेनिला जेएस

yourObjName.hasOwnProperty(key) : true ? false;

यदि आप यह देखना चाहते हैं कि ऑब्जेक्ट में es2015 में कम से कम एक संपत्ति है या नहीं

Object.keys(yourObjName).length : true ? false

जांच करने का सबसे आसान तरीका है

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

उदाहरण के लिए:

var keyExistsOn = (o, k) => k.split(".").reduce((a, c) => a.hasOwnProperty(c) ? a[c] || 1 : false, Object.assign({}, o)) === false ? false : true;

सत्य के रूप में वापसी मूल्य का तात्पर्य है कि वस्तु में कुंजी मौजूद है।


उनके प्रोजेक्ट में lodash करने वाले लोगों के लिए:
एक lodash _.get विधि है जो "गहरी" कुंजी प्राप्त करने का प्रयास करती है:

वस्तु के पथ पर मूल्य प्राप्त करता है। यदि हल किया गया मान अपरिभाषित है, तो डिफ़ॉल्ट स्थान को इसके स्थान पर वापस कर दिया जाता है।

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>

यह प्रभावी ढंग से जांच करेगा कि क्या कुंजी, हालांकि गहरी , परिभाषित की गई है और एक त्रुटि नहीं फेंक देगी जो आपके प्रोग्राम के प्रवाह को नुकसान पहुंचा सकती है यदि वह कुंजी परिभाषित नहीं है।


"key" in obj

संभवतः ऑब्जेक्ट विशेषता मानों का परीक्षण कर रहा है जो सरणी कुंजी से बहुत अलग हैं


उत्तर:

if ("key" in myObj)
{
    console.log("key exists!");
}
else
{
    console.log("key doesn't exist!");
}

स्पष्टीकरण:

ऑपरेटर जांच करेगा कि वस्तु में कुंजी मौजूद है या नहीं। यदि आपने चेक किया है कि मान अपरिभाषित था: if (myObj["key"] === 'undefined') , तो आप समस्याओं में भाग ले सकते हैं क्योंकि आपके ऑब्जेक्ट में undefined मान के साथ एक कुंजी संभवतः मौजूद हो सकती है।

इसी कारण से, पहले ऑपरेटर का उपयोग करने के लिए यह बहुत बेहतर अभ्यास है और फिर एक बार जब आप पहले से ही जानते हैं तो कुंजी के अंदर मौजूद मान की तुलना करें।


हालांकि यह जरूरी है कि कोई कुंजी मौजूद है या नहीं, यह मूल्य की सत्यता की जांच करता है। जो undefined और null गिरावट के तहत गिरती है।

Boolean(obj.foo)

यह समाधान मेरे लिए सबसे अच्छा काम करता है क्योंकि मैं टाइपस्क्रिप्ट का उपयोग करता हूं, और 'foo' in obj या obj.hasOwnProperty('foo') 'foo' in obj जैसे स्ट्रिंग का उपयोग करके यह जांचने के लिए कि कोई कुंजी मौजूद है या नहीं, मुझे obj.hasOwnProperty('foo') प्रदान नहीं करती है।


यह एक पुराना सवाल है, लेकिन मुझे लगता है कि उत्तर देने में देर हो चुकी है।

कल्पना करें कि आपके पास ऑब्जेक्ट "उत्पाद" और दो आइटम हैं। यदि आप देखना चाहते हैं कि इस ऑब्जेक्ट में आईडी पहले से मौजूद है या नहीं, तो आप ढूंढ सकते हैं ()

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

जावास्क्रिप्ट ऑब्जेक्ट में कोई संपत्ति मौजूद है या नहीं, यह जांचने के तीन तरीके:

  1. !! obj.theProperty
    मूल्य को बूल में परिवर्तित कर देगा। सभी के लिए 'झूठी' मान के लिए सत्य लौटाता है
  2. obj में 'प्रॉपर्टी'
    यदि संपत्ति मौजूद है तो सत्य वापस आ जाएगा, इससे कोई फर्क नहीं पड़ता कि उसका मूल्य (यहां तक ​​कि खाली)
  3. obj.hasOwnProperty ( 'theProperty')
    प्रोटोटाइप श्रृंखला की जांच नहीं करता है। (चूंकि सभी ऑब्जेक्ट्स में 'toString' विधि होती है, 1 और 2 उस पर सच हो जाएंगी, जबकि 3 उस पर झूठी वापसी कर सकती है।)

संदर्भ:

http://book.mixu.net/node/ch5.html


अपरिभाषित-नस्ल की जांच करना एक कुंजी मौजूद है या नहीं, यह जांचने का एक सटीक तरीका नहीं है। क्या होगा अगर कुंजी मौजूद है लेकिन मूल्य वास्तव में undefined ?

var obj = { key: undefined };
obj["key"] != undefined // false, but the key exists!

आपको इसके बजाय ऑपरेटर का उपयोग करना चाहिए:

"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 उपयोग hasOwnProperty :

obj.hasOwnProperty("key") // true

विधियों के बीच प्रदर्शन तुलना के लिए, hasOwnProperty और कुंजी undefined , इस jsben.ch/#/WqlIl देखें


शीघ्र जवाब

जावास्क्रिप्ट ऑब्जेक्ट या सरणी में कोई विशेष कुंजी मौजूद है या नहीं? यदि कोई कुंजी मौजूद नहीं है और मैं इसे एक्सेस करने का प्रयास करता हूं, तो क्या यह झूठी वापसी करेगा? या एक त्रुटि फेंक दो?

(सहयोगी) सरणी शैली या ऑब्जेक्ट शैली का उपयोग कर सीधे एक लापता संपत्ति तक पहुंचने से एक अनिर्धारित निरंतर वापस आ जाएगा।

ऑपरेटर में धीमी और भरोसेमंद और हैऑनप्रॉपर्टी विधि है

जैसा कि लोगों ने पहले ही उल्लेख किया है, आप एक "अपरिभाषित" निरंतर से जुड़े संपत्ति के साथ एक वस्तु हो सकती है।

 var bizzareObj = {valid_key:  undefined};

उस स्थिति में, आपको यह पता लगाने के लिए है कि कुंजी वास्तव में है या नहीं , ऑपरेटर में हैऑनप्रोपर्टी या ऑपरेटर का उपयोग करना होगा। लेकिन, लेकिन किस कीमत पर?

तो, मैं आपको बताता हूं ...

ऑपरेटर और hasOwnProperty में "विधियां" हैं जो जावास्क्रिप्ट में संपत्ति वर्णनकर्ता तंत्र का उपयोग करती हैं (जावा भाषा में जावा प्रतिबिंब के समान)।

http://www.ecma-international.org/ecma-262/5.1/#sec-8.10

संपत्ति वर्णनकर्ता प्रकार का नाम संपत्ति संपत्ति विशेषताओं में हेरफेर और संशोधन की व्याख्या करने के लिए किया जाता है। संपत्ति वर्णनकर्ता प्रकार के मान नामित फ़ील्ड से बना रिकॉर्ड हैं जहां प्रत्येक फ़ील्ड का नाम एक विशेषता नाम है और इसका मान 8.6.1 में निर्दिष्ट अनुसार एक समान विशेषता मान है। इसके अलावा, कोई भी क्षेत्र उपस्थित या अनुपस्थित हो सकता है।

दूसरी ओर, किसी ऑब्जेक्ट विधि या कुंजी को कॉल करने से जावास्क्रिप्ट [[प्राप्त करें]] तंत्र का उपयोग किया जाएगा। यह बहुत तेज़ तरीका है!

बेंचमार्क

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 मान निर्दिष्ट करने का कारण क्या है?

वह सवाल मुझे पहेली करता है। जावास्क्रिप्ट में, इस तरह की समस्याओं से बचने के लिए अनुपस्थित वस्तुओं के लिए कम से कम दो संदर्भ हैं: null और undefined

null एक आदिम मूल्य है जो किसी भी वस्तु मूल्य की जानबूझकर अनुपस्थिति का प्रतिनिधित्व करता है, या संक्षेप में, मूल्य की पुष्टि की कमी। दूसरी ओर, undefined अज्ञात मान है (परिभाषित नहीं)। यदि कोई ऐसी संपत्ति है जिसका उपयोग उचित मूल्य के साथ बाद में किया जाएगा, तो undefined बजाय null संदर्भ का उपयोग करें क्योंकि शुरुआती पल में संपत्ति को मूल्य की कमी होने की पुष्टि की जाती है।

की तुलना करें:

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 का उपयोग करें। अन्यथा, धीमी ऑपरेटर या hasOwnProperty() विधि का उपयोग करें।

संपादित करें: 12/04/2018 - किसी भी तरह से जारी नहीं है

जैसा कि लोगों ने टिप्पणी की है, जावास्क्रिप्ट इंजन के आधुनिक संस्करण (फ़ायरफ़ॉक्स अपवाद के साथ) ने एक्सेस गुणों के लिए दृष्टिकोण बदल दिया है। वर्तमान कार्यान्वयन इस विशेष मामले के लिए पिछले एक की तुलना में धीमा है लेकिन पहुंच कुंजी और वस्तु के बीच अंतर उपेक्षित है।


यहां एक सहायक कार्य है जो मुझे काफी उपयोगी लगता है

यह 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;
}

इसे कैसे उपयोग करे:

Arrays में कुंजी के लिए खोज रहे हैं

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

यह बहुत विश्वसनीय रहा है और अच्छी तरह से क्रॉस ब्राउज़र काम करता है।


स्वीकृत उत्तर Object को संदर्भित करता है। कुंजी के बजाय डेटा खोजने के लिए Array पर ऑपरेटर का उपयोग करके सावधान रहें:

("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)

एक ऐरे में मौजूदा तत्वों का परीक्षण करने के लिए: यह पता लगाने का सबसे अच्छा तरीका है कि कोई आइटम जावास्क्रिप्ट सरणी में है या नहीं?


हम उपयोग कर सकते हैं - 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);
};

यह 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 रखना चाहते हैं। मुझे ऐसा करने की कभी आवश्यकता नहीं है और मैं किसी कारण से नहीं सोच सकता कि मैं कभी चाहूंगा, लेकिन सिर्फ पूर्णता के लिए, आप ऑपरेटर का उपयोग कर सकते हैं

// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
    // do something
}

यदि आप किसी ऑब्जेक्ट पर किसी भी गहराई पर किसी भी कुंजी की जांच करना चाहते हैं और झूठी मानों के लिए खाता उपयोगिता फ़ंक्शन के लिए इस पंक्ति को मानते हैं:

"key" in object

परिणाम

var obj = {
  a: 1,
  b: 2,
}
"a" in obj // true
"c" in obj // false

यह एनपीएम पैकेज भी देखें: https://www.npmjs.com/package/has-deep-value


जावास्क्रिप्ट विनाश के साथ नया भयानक समाधान:

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

जावास्क्रिप्ट विनाश के अन्य उपयोग की जांच करें


अपने उदाहरण के अनुसार, आपको दो फ़ील्ड (अंतिम नाम, पहला नाम), फिर एक से क्रमबद्ध करने की आवश्यकता है। आप इस प्रकार को एक पंक्ति में बनाने के लिए Alasql लाइब्रेरी का उपयोग कर सकते हैं:

var res = alasql('SELECT * FROM ? ORDER BY last_nom, first_nom',[objs]);

JsFiddle पर इस उदाहरण का प्रयास करें।







javascript arrays object