这里有点奇怪,我正在解析查询字符串,有时它们会以字符串形式返回,而有时会以字符串数组形式返回(取决于是否有一个或多个)。
我想确定该键下是否存在该值,并且当数据为空或为null时,它需要工作。
# we have access to both the key and value
const key = 'locations'
const value = 'London'
数据的形状如下:
# does 'London' exist under `locations`?
{
locations: 'London',
skills: ['1', '2'],
}
数据的形状也可能像这样:
{
locations: ['London', 'Reading'],
skills: '1',
}
我看过使用pathSatisfies
,pathEq
和contains
,但运气不佳。我似乎对这个值可以包含在字符串或数组中的事实感到困惑。
答案 0 :(得分:2)
如果还没有,我会用镜头将键转换成数组。然后,您可以将propSatisfies
与includes
一起使用:
const toArr = unless(is(Array), of);
const check = (key, value) =>
pipe(
over(lensProp(key), toArr),
propSatisfies(includes(value), key));
console.log(
check('locations', 'London')({locations: ['London', 'Reading']})
);
console.log(
check('locations', 'London')({locations: 'London'})
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {unless, is, of, pipe, over, lensProp, propSatisfies, includes} = R;</script>
编辑:实际上,这可以简化为includes
使用字符串和数组:
const check = (key, value) => where({[key]: includes(value)})
console.log(
check('locations', 'London')({locations: 'London'})
);
console.log(
check('locations', 'London')({locations: ['London', 'Reading']})
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {where, includes} = R;</script>
答案 1 :(得分:1)
如注释中所述,使用Array.isArray()
来查看该属性是否包含数组,如果有则使用数组方法,否则直接比较值
const key = 'locations',
value = 'London',
data = {
locations: 'London',
skills: ['1', '2'],
},
data2 = {
locations: ['London', 'Reading'],
skills: '1',
}
const hasValue = (data, key, value) => {
const testVal = data[key];
return Array.isArray(testVal) ? testVal.includes(value) : testVal === value;
}
// string version
console.log(hasValue(data, key, value));
// array version
console.log(hasValue(data2, key, value))
答案 2 :(得分:0)
这个小功能应该可以帮助您。
function hasValue(obj, key, value) {
if (!obj) return false;
let prop = obj[key];
if (!prop) return false;
if (Array.isArray(prop))
return prop.indexOf(value) >= 0;
return prop === value;
}