根据对象数组验证相同的值

时间:2018-12-03 19:57:04

标签: javascript lodash

如何验证用户没有为两个相反的规则输入相同的值。在此示例中,我们可以在名称为Test时阻止用户,而在名称不是Test时阻止用户。目的是显示一条错误消息,告诉用户name_isname_is_not不能具有相同的值。如何为此编写验证?我可以用lodash

const rules = [
  {rule: "name_is", value: "Test"},
  {rule: "name_is_not", value: "Test"},
  {rule: "surname_is", value: "Foo"}
  {rule: "surname_is_not", value: "Bar"},
  {rule: "name_is", value: "Fux"}
];

2 个答案:

答案 0 :(得分:2)

对于每次按键检查Map,将它们转换为key + _not,并对其进行迭代:

const rules = [
  {rule: "name_is", value: "Test"},
  {rule: "name_is_not", value: "Test"},
  {rule: "surname_is", value: "Foo"},
  {rule: "surname_is_not", value: "Bar"}
]


let m = new Map(rules.map(x => [x.rule, x.value]))

for (let [rule, value] of m.entries())
    if (m.get(rule + '_not') === value)
        console.log(rule, '???')

答案 1 :(得分:0)

您还可以使用Array.reduce并每次检查是否存在带有_not的键及其值。如果有,您可以在累加器的summary对象中跟踪它:

const rules = [ {rule: "name_is", value: "Test"}, {rule: "surname_is", value: "Foo"}, {rule: "surname_is_not", value: "Bar"}, {rule: "name_is_not", value: "Test"} ] 

const result = rules.reduce((r,{rule, value}) => {
  let key = rule.replace('_not', '')
  r[key] == value ? r.summary[rule] = `same as ${key}` : r[rule] = value
  return r
}, {summary: {}}).summary

console.log(result)  // "name_is_not": "same as name_is"

相关问题