lodash检查object.path等于value

时间:2019-04-24 15:18:17

标签: node.js lodash

我有一个类似...的对象

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

我想使用lodash(或与此有关的任何东西)进行检查,例如...

  

object.person.pet.name上的值等于"Spot"吗?

目前我唯一看到的选择是从对象中获得宠物的名字,然后检查它是否等于“ Spot”。

是否有一个函数可以使我进行一次检查,就像...

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

如果它通过lodash存在或不存在,那就太好了。

此刻我使用lodash的原因是我不知道人,宠物或名字是否会真正存在,所以lodash为我提供了一种“安全”获取数据的方法。

2 个答案:

答案 0 :(得分:1)

lodash 中似乎不存在这样的方法。

无论如何,您可以使用findKey方法来查找与给定要求匹配的密钥。

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

如果返回undefined,则表示不相等。


请参见documentation

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'


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

答案 1 :(得分:1)

您可以使用_.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>