Как проверить, нужны ли объекту ключи - PullRequest
0 голосов
/ 19 сентября 2018

Какой лучший способ сделать?Я также заинтересован в методах lodash, если есть какой-то лучший подход

var myObj = {
  name: 'John',
  age: 20,
  sex: male
}

Мне нравится видеть, есть ли у myObj ключи 'name' и 'age'

Мой подход - он отлично работает

var myObj = {
  name: 'John',
  age: 20,
  sex: 'male'
}
var value;

function result() {
  if (myObj.hasOwnProperty('name') && myObj.hasOwnProperty('age')) {
    value = true;
  } else {
    value = false;
  }
}
result();
console.log(value);

Я также могу использовать («ключ» в myObj)

Но на самом деле у меня есть объект, который довольно большой и нужно проверить, есть ли у него особыйключи.В поисках лучшего подхода

Ответы [ 7 ]

0 голосов
/ 19 сентября 2018

Использование lodash , с имеет метод

var _ = require('lodash');
var myObj = {
   name: 'John',
   age: 20,
   sex: male
}

var has_keys = _.has(myObj, ['name', 'age', 'sex']);
// has_keys => true
0 голосов
/ 20 сентября 2018

Мне нравится использовать lodash get для глубоких объектов.Причина заключается в том, чтобы решить проблему, когда какое-либо глубокое свойство не определено или отсутствует.Вместо ошибок в консоли и прочем используйте -

var object = {'a': [{'b': {'c': 3}}]};

_. Get (объект, 'a [0] .b.c');// => 3

_. Get (object, ['a', '0', 'b', 'c']);// => 3

_. Get (object, 'abc', 'default');// => 'default'

From - https://lodash.com/docs/4.17.10#get

0 голосов
/ 19 сентября 2018

В этом вопросе есть некоторые тонкости, которые могут или не могут быть важными.

У объектов в Javascript есть прототипы, которые могут наследовать свойства от других объектов.Не ясно, будет ли myObj допустимым, если в прототипе будет найдено одно из обязательных свойств.

Вот пример:

const parent = {
    name: 'John',
    age: 20,
    sex: 'male'
  }
 
const requiredKeys = ['name', 'age']

let valid = requiredKeys.every(key => parent.hasOwnProperty(key))

// valid becuase parent has name and age
console.log("Parent valid:", valid)

// but what about child that inherits from parent:

let child = Object.create(parent)

valid = requiredKeys.every(key => child.hasOwnProperty(key))

// not valid becuase child doesn't directly has name and age
console.log("Child Valid:", valid)

// yet those properties seem to exist because you can get them through parent's prototype:
console.log("Child name and age:", child.name, child.age)

// you can test up the protoytpe chain with …in:

valid = requiredKeys.every(key => key in child)

// now valid becuase child has name and age somewhere in the prototype chain 
console.log("Child Valid (with prototype):", valid)

Таким образом, вопрос будет: что наиболее подходит для вашего варианта использования.

0 голосов
/ 19 сентября 2018

Вы можете просто использовать оператор in для поиска в постоянном времени (нет необходимости помещать ключи в массив, который является линейным поиском):

var myObj = {
  name: "John",
  age: 20,
  sex: "male"
};

console.log(["name", "age"].every(e => e in myObj));
0 голосов
/ 19 сентября 2018

Создать массив ключей.Итерируйте массив с Array.every() и проверьте, находится ли каждый ключ в объекте, используя Object.hasOwnProperty():

const myObj = {
  name: 'John',
  age: 20,
  sex: 'male'
};

const hasKeys = (obj, keys) => keys.every(key => obj.hasOwnProperty(key));
  
console.log(hasKeys(myObj, ['name', 'age']));

console.log(hasKeys(myObj, ['name', 'title']));
0 голосов
/ 19 сентября 2018
function validateObj (myObj) {
   var nameFound = false;
   var ageFound = false;
   for (x in myObj) {
       if (x === "name") nameFound = true;
       if (x === "age")  ageFound = true;
       if (ageFound && nameFound) return true;
   }
   return (ageFound && nameFound)
}
0 голосов
/ 19 сентября 2018

Поместите нужные ключи в массив:

let requiredKeys = ["name", "age"];

И затем используйте метод Array.every и Object.keys:

let objectKeys = Object.keys(myObj);
let hasRequiredKeys = requiredKeys.every(k => objectKeys.includes(k));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...