Compruebe si existe una clave dentro de un objeto json

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

Lo anterior es el objeto JSON con el que estoy tratando. Quiero verificar si existe la clave 'merchant_id'. Intenté el siguiente código, pero no funciona. ¿Alguna forma de lograrlo?

<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
fuente
¿Cuál es la salida de <?php echo json_encode($_POST); ?>?
Daiwei
Su salida es lo que he mostrado en la parte superior de mi pregunta, el objeto json
Ajeesh
1
¿Cuál es la salida de console.log(thisSession);?
Daiwei
1
Además, ¿cuál es el beneficio de usar !("merchant_id" in thisSession)==0donde simplemente puede usar "merchant_id" in thisSession?
Daiwei
2
¿Posible duplicado de Comprobación si existe una clave en un objeto JavaScript?
Anderson Green

Respuestas:

585

Prueba esto,

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

}

el objeto JS thisSessiondebería ser como

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

puedes encontrar los detalles aquí

Anand Jha
fuente
66
Para la edificación, lo que, en su caso, es la diferencia entre if(thisSession.merchant_id !== undefined)y if(thisSession.hasOwnProperty('merchant_id'))o está haciendo lo mismo detrás de las escenas?
zero298
2
@ zero298, ambos no son lo mismo, el uso de hasOwnProperty es seguro ... más detalles, consulte el enlace stackoverflow.com/questions/10895288/…
Anand Jha
Eslint arroja el error error Do not access Object.prototype method 'hasOwnProperty' from target object al usar este método. Pensamientos?
hamncheez
2
@hamncheez Si JSON tiene el campo 'hasOwnProperty', sombreará la función original. UsoObject.prototype.hasOwnProperty.call(thisSession, 'merchant_id')
Zmey
79

Hay varias formas de hacerlo, dependiendo de su intención.

thisSession.hasOwnProperty('merchant_id'); le dirá si thisSession tiene esa clave en sí (es decir, no es algo que hereda de otro lugar)

"merchant_id" in thisSession le dirá si esta sesión tiene la clave, independientemente de dónde la haya obtenido.

thisSession["merchant_id"]devolverá falso si la clave no existe, o si su valor se evalúa como falso por algún motivo (por ejemplo, si es un literal falseo el entero 0, etc.).

Pablo
fuente
2
thisSession ["merchant_id"] devolverá indefinido, no falso.
p_champ
Ok, "falsedad" entonces.
Paul
25

(Quería señalar esto a pesar de que llego tarde a la fiesta)
La pregunta original que estabas tratando de encontrar un 'No IN' esencialmente. Parece que no es compatible con la investigación (2 enlaces a continuación) que estaba haciendo.

Entonces, si quisieras hacer un 'No en':

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

Recomiendo simplemente configurar esa expresión == a lo que estás buscando

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
fuente
17

La verificación de tipo también funciona:

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

Modifico un poco tu sentencia if y funciona (también para obj heredado - mira el fragmento)

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

Kamil Kiełczewski
fuente
7

puedes hacer así:

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

o

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

función para verificar objetos indefinidos y nulos

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

Aquí hay una manera fácil de verificar si el objeto enviado contiene valores indefinidos o nulos

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
fuente
-13

Puedes probar if(typeof object !== 'undefined')

Zonger
fuente