Проверять наличие нескольких ключей в объекте JavaScript? - PullRequest
1 голос
/ 30 сентября 2019

Есть ли встроенная или библиотечная функция для проверки нескольких ключей одновременно?

Скажите, что это мой объект:

const foo = {};
foo.superLongNameNeededByPackage = {cat: {black: 1}, hat: 2, bat:3, mat: 12}
console.log(foo);
// { superLongNameNeededByPackage : {cat: {black: 1}, hat: 2, bat:3, mat: 12} }

И я хочу проверить, что на нем есть различные ключи, если есть способ сделать это?

const isReadyForHalloween = hasMultipleKeys(foo.superLongNameNeededByPackage,
  ['cat.black', 'hat', 'bat']);

Я знаю Лодаша has, а также тот факт, что я могу написать свой собственный , используя Object.keysи every но я надеялся избежать этого, если это возможно, потому что он все еще чувствовал бы себя слишком многословным и требовал выписать полную формулировку.

const arr = Object.keys(foo.superLongNameNeededByPackage);
arr.every(item => item.hasOwnProperty("a")
               && item.hasOwnProperty("b")
               && item.hasOwnProperty("c") );

Но я не хочу писатьout hasOwnProperty каждый раз и может захотеть предоставить мой список ключей как свою собственную переменную.

Ответы [ 3 ]

1 голос
/ 30 сентября 2019

Хотя lodash не имеет встроенной функции, вы можете создать hasMultipleKeys(), используя _.overArgs().

Функция принимает массив ключей и объект, который вы хотите проверить. Массив передается непосредственно в _.every() (через _.identity()), а объект применяется к _.has() (используя _.curry()) для создания предиката для функции _.every().

const hasMultipleKeys = _.overArgs(_.every, [_.identity, _.curry(_.has)])


const foo = {cat: {black: 1}, hat: 2, bat:3, mat: 12}
  
console.log(hasMultipleKeys(['cat.black', 'hat', 'bat'], foo)) // true
console.log(hasMultipleKeys(['cat.black', 'nothing', 'bat'], foo)) // false
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
1 голос
/ 30 сентября 2019

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

function has(object, path) {
    return path.split('.').every(k => object.hasOwnProperty(k) && (object = object[k]));
}

function hasMultipleKeys(object, keys) {
    return keys.every(has.bind(null, object));
}

const foo = {};

foo.superLongNameNeededByPackage = { cat: { black: 1 }, hat: 2, bat: 3, mat: 12 };

const isReadyForHalloween = hasMultipleKeys(foo.superLongNameNeededByPackage,  ['cat.black', 'hat', 'bat']);
console.log(isReadyForHalloween);
0 голосов
/ 30 сентября 2019

У меня был точно такой же вопрос несколько дней назад. Это то, с чем я столкнулся. Он использует плоский пакет. https://www.npmjs.com/package/flat

      let foo;
      const obj = flatten(clonedObj, {maxDepth: 0});
      foo = ['yourkeys', 'yourkeys.secondLevel']
        .every(field => obj.hasOwnProperty(field) && !!obj[field]);
...