lodash check object.path равен значению - PullRequest
1 голос
/ 24 апреля 2019

У меня есть объект, подобный ...

let object = {
    person: {
        pet: {
            name: "Rover"
        }
    }
};

И я хотел бы использовать lodash (или что-нибудь в этом роде) для проверки вроде ...

Является ли значение на object.person.pet.name равным "Spot"?

В настоящее время я могу видеть только один вариант - вывести имя питомца из объекта и затем проверить, равно ли оно«Spot».

Есть ли функция, которую я могу использовать, чтобы сделать эту единственную проверку, что-то вроде ...

_.equals(object, 'person.pet.name', "Spot");

Это было бы замечательно, если бы она существовала черезlodash или нет.

Причина, по которой я сейчас использую lodash, заключается в том, что я не знаю, будет ли существовать человек, домашнее животное или имя, поэтому lodash дает мне возможность «безопасно»получить эти данные.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Вы можете использовать _.flow() для создания функции, которая получает значение пути с помощью _.get() и сравнивает его со значениями с помощью _.isEqual().

const { flow, partialRight: pr, get, isEqual } = _

const pathEq = (propPath, value) => flow(
  pr(get, propPath),
  pr(isEqual, value)
)

const object = {
  person: {
    pet: {
      name: "Rover"
    }
  }
};

console.log(pathEq('person.pet.name', 'Spot')(object)) // false
console.log(pathEq('person.pet.name', 'Rover')(object)) // true
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

Поскольку функции lodash не имеют автоматического каррирования, а параметры функций находятся не в правильном порядке (данные являются первыми), мне нужно использовать _.partialRight() для предоставления параметров и получения функции.

Этого можно избежать, используя lodash / fp :

const { useWith, flow, get, isEqual } = _

const pathEq = useWith(flow, [get, isEqual])

const object = {
  person: {
    pet: {
      name: "Rover"
    }
  }
};

console.log(pathEq('person.pet.name', 'Spot')(object)) // false
console.log(pathEq('person.pet.name', 'Rover')(object)) // true
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
1 голос
/ 24 апреля 2019

Похоже, что в lodash .

таких методов не существует.

В любом случае, вы можете использовать метод findKey, который найдет ключ, соответствующий заданным требованиям.

_.findKey(object, { 'person.pet.name' : 'Spot' });

Если он возвращает undefined, это означает, что он не был равен.


См. Документацию

var users = {
  'barney':  { 'age': 36, 'active': true },
  'fred':    { 'age': 40, 'active': false },
  'pebbles': { 'age': 1,  'active': true }
};

_.findKey(users, function(o) { return o.age < 40; });
// => 'barney' (iteration order is not guaranteed)

// The `_.matches` iteratee shorthand.
_.findKey(users, { 'age': 1, 'active': true });
// => 'pebbles'

// The `_.matchesProperty` iteratee shorthand.
_.findKey(users, ['active', false]);
// => 'fred'

// The `_.property` iteratee shorthand.
_.findKey(users, 'active');
// => 'barney'


Non loadash Пользовательская функция

const object = {
  person: {
    pet: {
      name: 'Rover',
    },
  },
};

function checkEquality(obj, key, value) {
  const val = key.split('.')
    .reduce((tmp, x) => (tmp !== void 0 && tmp[x] !== void 0 ? tmp[x] : void 0), obj);

  if (val === void 0) return false;

  return val === value;
}


console.log(checkEquality(object, 'person.pet.name', 'Rover'));
console.log(checkEquality(object, 'person.pet.name', 'RoverTT'));
console.log(checkEquality(object, 'person.petak.name', 'Rover'));
...