Ramda - 如何验证一个对象?

Ramda - How to validate an object?

我想使用 Ramda 重构下面的代码。我想将键和值列表与我从服务器接收到的数据进行比较,如果数据匹配,则函数 运行。为此,我创建了一个键和值列表,并使用 include() 我得到一个 boolean.

//example data

data = { fieldName: 'secretKey', fieldValue: 'ymt' } 


const fieldNames = ['secretKey', 'activateCode']
const fieldValues = ['ymt', 'IdTYj']

if ( fieldNames.includes(data.fieldName) || fieldValues.includes(data.fieldValue)) {
    yield put(isLoading(true));
}

我用 R.include 而不是 include() 但我总是得到 false

const field = R.equals( fieldNames, data.fieldName) // return false

Ramda 中哪种方法更适合将键和值与 return 和 boolean 进行比较?

我认为您正在寻找 where 例如

const check = where({ username: either(equals('foo'), equals('FOO'))
                    , password: either(equals('bar'), equals('BAR'))});

check({username: 'foo', password: 'qux'}); // false
check({username: 'qux', password: 'bar'}); // false
check({username: 'foo', password: 'bar'}); // true
check({username: 'foo', password: 'BAR'}); // true
check({username: 'FOO', password: 'BAR'}); // true

我宁愿做类似的事情, 您需要 R.flip(R.includes) 才能使用 在你的算法中

const put = R.identity;
const isLoading = R.identity;

function* validate(data) {
  const keys = ['secretKey', 'activateCode'];
  const values = ['ymt', 'IdTYj'];
  
  const predicate = R.where({
    fieldName: R.includes(R.__, keys),
    fieldValue: R.includes(R.__, values),
  });
  
  if (predicate(data)) {
    yield put(isLoading(true));
  }
};

const iterator = validate({ 
  fieldName: 'secretKey', 
  fieldValue: 'ymt',
});

console.log(
  iterator.next().value
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>