Ajeesh
Ajeesh

Reputation: 5860

Check if a key exists inside a JSON object

amt: "10.00"
email: "[email protected]"
merchant_id: "sam"
mobileNo: "9874563210"
orderID: "123456"
passkey: "1234"

The above is the JSON object I'm dealing with. I want to check if the merchant_id key exists. I tried the below code, but it's not working. Any way to achieve it?

<script>
window.onload = function getApp()
{
  var thisSession = JSON.parse('<?php echo json_encode($_POST); ?>');
  //console.log(thisSession);
  if (!("merchant_id" in thisSession)==0)
  {
    // do nothing.
  }
  else 
  {
    alert("yeah");
  }
}
</script>

Upvotes: 460

Views: 1044715

Answers (11)

GrandOpener
GrandOpener

Reputation: 2123

JavaScript changes once again!

(TL;DR: Use Object.hasOwn now.)

The long standing highest-voted answer recommends using hasOwnProperty. This was the best answer at the time, but it does have a number of tricky bits that can trip you up. For example, if the variable can be null, this will cause a TypeError when you attempt to call hasOwnProperty. Less commonly (but a symptom of the same problem), if an object could potentially have a key named "hasOwnProperty," that would shadow the function you wanted. (This could be a problem if, for example, you are parsing user-provided input.)

Because of all that, the previously correct way to call the function is this mess:

Object.prototype.hasOwnProperty.call(thisSession, "merchant_id");

In updated browsers and recent versions of node there is a new alternative that addresses these problems. Object now has a static method named hasOwn that addresses these pitfalls.

Object.hasOwn(thisSession, "merchant_id")

Ahh, much better. :)

If you are targeting browsers or node versions new enough to have hasOwn, you should stop using hasOwnProperty entirely. It is obsolete.

Upvotes: 1

Anand Jha
Anand Jha

Reputation: 10724

Try this

if (thisSession.hasOwnProperty("merchant_id")) {

}

the JS Object thisSession should be like

{
  amt: "10.00",
  email: "[email protected]",
  merchant_id: "sam",
  mobileNo: "9874563210",
  orderID: "123456",
  passkey: "1234"
}

you can find the details here

Upvotes: 787

Sankha Jayalath
Sankha Jayalath

Reputation: 795

we can use lodash library

import _ from 'lodash';

if(_.isEmpty(merchant_id)){
    // do nothing
}
else{
    //do something with merchant id
}

Upvotes: 0

Sam
Sam

Reputation: 1376

(I wanted to point this out even though I'm late to the party)
The original question you were trying to find a 'Not IN' essentially. It looks like it is not supported by the research (2 links below) that I was doing.

So if you wanted to do a 'Not In':

    ("merchant_id" in x)
    true
    ("merchant_id_NotInObject" in x)
    false 

I'd recommend using the ! operator

    if (!("merchant_id" in thisSession))
    {
        // do nothing.
    }
    else 
    {
        alert("yeah");
    }

https://linuxhint.com/use-not-in-operator-javascript/

Upvotes: 43

Syed
Syed

Reputation: 16543

This code causes esLint issue: no-prototype-builtins

foo.hasOwnProperty("bar") 

The suggest way here is:

Object.prototype.hasOwnProperty.call(foo, "bar");

Upvotes: 16

code2heaven
code2heaven

Reputation: 479

you can do like this:

if("merchant_id" in thisSession){ /** will return true if exist */
 console.log('Exist!');
}

or

if(thisSession["merchant_id"]){ /** will return its value if exist */
 console.log('Exist!');
}

Upvotes: 37

Kamil Kiełczewski
Kamil Kiełczewski

Reputation: 92735

I change your if statement slightly and works (also for inherited obj - look on snippet)

if(!("merchant_id" in thisSession)) alert("yeah");

var sessionA = {
  amt: "10.00",
  email: "[email protected]",
  merchant_id: "sam",
  mobileNo: "9874563210",
  orderID: "123456",
  passkey: "1234",
}

var sessionB = {
  amt: "10.00",
  email: "[email protected]",
  mobileNo: "9874563210",
  orderID: "123456",
  passkey: "1234",
}


var sessionCfromA = Object.create(sessionA); // inheritance
sessionCfromA.name = 'john';


if (!("merchant_id" in sessionA)) alert("merchant_id not in sessionA");
if (!("merchant_id" in sessionB)) alert("merchant_id not in sessionB");
if (!("merchant_id" in sessionCfromA)) alert("merchant_id not in sessionCfromA");

if ("merchant_id" in sessionA) alert("merchant_id in sessionA");
if ("merchant_id" in sessionB) alert("merchant_id in sessionB");
if ("merchant_id" in sessionCfromA) alert("merchant_id in sessionCfromA");

Upvotes: 9

Kailas
Kailas

Reputation: 7578

Type check also works :

if(typeof Obj.property == "undefined"){
    // Assign value to the property here
    Obj.property = someValue;
}

Upvotes: 27

sai sanath
sai sanath

Reputation: 51

function to check undefined and null objects

function elementCheck(objarray, callback) {
        var list_undefined = "";
        async.forEachOf(objarray, function (item, key, next_key) {
            console.log("item----->", item);
            console.log("key----->", key);
            if (item == undefined || item == '') {
                list_undefined = list_undefined + "" + key + "!!  ";
                next_key(null);
            } else {
                next_key(null);
            }
        }, function (next_key) {
            callback(list_undefined);
        })
    }

here is an easy way to check whether object sent is contain undefined or null

var objarray={
"passenger_id":"59b64a2ad328b62e41f9050d",
"started_ride":"1",
"bus_id":"59b8f920e6f7b87b855393ca",
"route_id":"59b1333c36a6c342e132f5d5",
"start_location":"",
"stop_location":""
}
elementCheck(objarray,function(list){
console.log("list");
)

Upvotes: 0

Zonger
Zonger

Reputation: 63

You can try if(typeof object !== 'undefined')

Upvotes: -16

Paul
Paul

Reputation: 36349

There's several ways to do it, depending on your intent.

thisSession.hasOwnProperty('merchant_id'); will tell you if thisSession has that key itself (i.e. not something it inherits from elsewhere)

"merchant_id" in thisSession will tell you if thisSession has the key at all, regardless of where it got it.

thisSession["merchant_id"] will return false if the key does not exist, or if its value evaluates to false for any reason (e.g. if it's a literal false or the integer 0 and so on).

Upvotes: 110

Related Questions