对象Ramda中的数组或字符串中的值是

时间:2019-03-27 22:11:21

标签: javascript ramda.js

这里有点奇怪,我正在解析查询字符串,有时它们会以字符串形式返回,而有时会以字符串数组形式返回(取决于是否有一个或多个)。

我想确定该键下是否存在该值,并且当数据为空或为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',
}

我看过使用pathSatisfiespathEqcontains,但运气不佳。我似乎对这个值可以包含在字符串或数组中的事实感到困惑。

3 个答案:

答案 0 :(得分:2)

如果还没有,我会用镜头将键转换成数组。然后,您可以将propSatisfiesincludes一起使用:

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;
}