Проверка одинаковых значений на основе массива объекта - PullRequest
0 голосов
/ 03 декабря 2018

Как я могу проверить, что пользователь не вводит одно и то же значение для двух противоположных правил.В этом примере мы можем блокировать пользователей, когда имя Test, но блокировать пользователей, если имя не Test.Цель - показать сообщение об ошибке, сообщающее пользователям, что name_is и name_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 голосов
/ 03 декабря 2018

Что вы также можете сделать, это использовать 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"
0 голосов
/ 03 декабря 2018

Преобразуйте их в 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, '???')
...