我有一个类似...的对象
let object = {
person: {
pet: {
name: "Rover"
}
}
};
我想使用lodash
(或与此有关的任何东西)进行检查,例如...
object.person.pet.name
上的值等于"Spot"
吗?
目前我唯一看到的选择是从对象中获得宠物的名字,然后检查它是否等于“ Spot”。
是否有一个函数可以使我进行一次检查,就像...
_.equals(object, 'person.pet.name', "Spot");
如果它通过lodash
存在或不存在,那就太好了。
此刻我使用lodash
的原因是我不知道人,宠物或名字是否会真正存在,所以lodash为我提供了一种“安全”获取数据的方法。
答案 0 :(得分:1)
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'
非 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>