Verifique se existe uma chave dentro de um objeto json

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

O texto acima é o objeto JSON com o qual estou lidando. Quero verificar se a chave 'merchant_id' existe. Eu tentei o código abaixo, mas não está funcionando. Alguma maneira de conseguir isso?

<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>
Ajeesh
fonte
Qual é a saída de <?php echo json_encode($_POST); ?>?
Daiwei
Seu posto para fora é o que tenho mostrado no topo da minha pergunta, o objeto json
ajeesh
1
Qual é a saída de console.log(thisSession);?
Daiwei
1
Além disso, qual é o benefício de usar !("merchant_id" in thisSession)==0onde você pode simplesmente usar "merchant_id" in thisSession?
Daiwei
2
Possível duplicata de Verificando se existe uma chave em um objeto JavaScript?
Anderson Green

Respostas:

585

Tente isso,

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

}

o objeto JS thisSessiondeve ser como

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

você pode encontrar os detalhes aqui

Anand Jha
fonte
6
Para edificação, o que, se houver, é a diferença entre if(thisSession.merchant_id !== undefined)e if(thisSession.hasOwnProperty('merchant_id'))ou está fazendo a mesma coisa nos bastidores?
zero298
2
@ zero298, ambos não são iguais, usar hasOwnProperty é seguro ... mais detalhes, por favor verifique o link stackoverflow.com/questions/10895288/…
Anand Jha
Eslint lança o erro error Do not access Object.prototype method 'hasOwnProperty' from target object ao usar este método. Pensamentos?
21719 hamncheez
2
@hamncheez Se o JSON tiver o campo 'hasOwnProperty', ele sombreará a função original. UseObject.prototype.hasOwnProperty.call(thisSession, 'merchant_id')
Zmey
79

Existem várias maneiras de fazer isso, dependendo da sua intenção.

thisSession.hasOwnProperty('merchant_id'); dirá se esta sessão possui essa chave em si (ou seja, não é algo que ela herda de outro lugar)

"merchant_id" in thisSession dirá se esta sessão tem a chave, independentemente de onde ela foi obtida.

thisSession["merchant_id"]retornará false se a chave não existir ou se seu valor for avaliado como false por qualquer motivo (por exemplo, se for um literal falseou o número inteiro 0 e assim por diante).

Paulo
fonte
2
thisSession ["merchant_id"] retornará indefinido, não falso.
P_champ
Ok, "falsy" então.
Paul
25

(Eu queria salientar isso mesmo que eu esteja atrasado para a festa)
A pergunta original que você estava tentando encontrar essencialmente 'Não está dentro'. Parece que não há suporte na pesquisa (2 links abaixo) que eu estava fazendo.

Então, se você quiser fazer um 'Not In':

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

Eu recomendo apenas definir essa expressão == para o que você está procurando

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in http://www.w3schools.com/jsref/jsref_operators.asp

Sam
fonte
17

A verificação de tipo também funciona:

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

Eu mudo sua instrução if levemente e funciona (também para objetos herdados - veja no snippet)

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

Kamil Kiełczewski
fonte
7

você pode fazer assim:

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

ou

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

função para verificar objetos nulos e indefinidos

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);
        })
    }

aqui está uma maneira fácil de verificar se o objeto enviado contém indefinido ou nulo

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");
)
sai sanath
fonte
-13

Podes tentar if(typeof object !== 'undefined')

Zonger
fonte