10

I am trying to validate the request object to check if specific keys exist in the object or not. I've tried lodash's has() function, but it seems that _.has() checks nested JSON. JavaScript's .hasOwnProperty() takes one key at a time. Is it possible to check an array of keys within a plain JSON object?

The object I am trying to check is:

{
    "name": "[email protected]",
    "oldPassword": "1234",
    "newPassword": "12345"
}
3
  • 2
    Why not check like obj.name && obj.oldPassword && obj.newPassword ? If you want to check for a fixed structure, you need to have some sort of types like Typscript provides for example. Commented Feb 26, 2019 at 9:11
  • 1
    @DavidJoos It will be a bit tedious in case the object gets multiple keys. Commented Feb 26, 2019 at 9:51
  • 1
    sure, but especially in this case i wouldn't hesitate to use it like this. Commented Feb 26, 2019 at 9:54

4 Answers 4

29

Simply use Object.keys and every

const neededKeys = ['oldPassword', 'name', 'newPassword'];

const obj = {
    "name": "[email protected]",
    "oldPassword": "1234",
    "newPassword": "12345"
}

console.log(neededKeys.every(key => Object.keys(obj).includes(key)));

Sign up to request clarification or add additional context in comments.

2 Comments

would Object.keys(obj).every(key => neededKeys.includes(key)); be more efficient? I imagine Object.keys would require an iteration over the object each time. So if you're only doing it once, instead of n times would it be better this way?
Yes, but that would fail if there's an additional key in the object (which might be allowed)... @NickParsons. However, it would surely be better to create a variable holding Object.keys(obj)s value and check with that
2

You can use in operator to check if keys exist in object or not. It is quite faster than Object.keys as its complexity is O(1) as compared to Object.keys with complexity of O(n)

Example:

const neededKeys = ['oldPassword', 'name', 'newPassword'];

const obj = {
    "name": "[email protected]",
    "oldPassword": "1234",
    "newPassword": "12345"
}

console.log(neededKeys.every(key => key in obj));

Comments

1

You can use .includes method of an array and Object.keys will give you an array of all the keys. You can compare this with an array of keys from which you want to check using a loop

var a = {
  "name": "[email protected]",
  "oldPassword": "1234",
  "newPassword": "12345"
};
var key = ["name", "oldPassword", "newPassword"];
Object.keys(a).forEach(e => key.includes(e) ? console.log(e + " found") : console.log(e + " not found"))

Comments

0
myobj =  {
    "name": "[email protected]",
    "oldPassword": "1234",
    "newPassword": "12345"
}
Print (myobj.keys() >= {"name","oldPassword","newPassword"})  

-- this will return True

Print (myobj.keys() >= {"name1","id","firstname"})  

-- this will return false

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.