Проверка и форматирование вывода массива на основе другого массива (JavaScript) - PullRequest
0 голосов
/ 25 сентября 2018

Надеюсь найти более эффективный способ решения приведенной ниже проблемы, чем мое текущее решение (которое входит в комплект).

У меня есть следующий массив, описывающий пользователя:

const userFields = [
     {key: "name", value: "tyler"},
     {key: "location", value: "boston"},
     {key: "phone", value: "555-555-5555"},
     {key: "email", value: "tyler@test.com"}
 ]

имассив, в котором указаны допустимые первичные поля (некоторые обязательные, некоторые необязательные):

const primaryFields = [
    { key: "name", alias: ["nickname"], required: true },
    { key: "address", alias: ["location", "homebase"], required: true },
    { key: "age", alias: [], required: true },
    { key: "phone", alias: [], required: false },
    { key: "gender", alias: [], required: false }
 ]

Проверка правильности массива userFields с помощью информации, предоставленной в массиве primaryFields, и получение трех возможных выходных данных: первичные поля (объект),вторичные поля (массив), пропущенные поля (массив).Кроме того, пара предостережений, 1. userFields должны быть распознаны либо ключом или псевдонимом, и 2. ключ для первичных полей должен быть ключом, используемым в массиве primaryFields (если псевдоним используется в userFields).

Итаквышеприведенное должно вывести:

{
     primary:{
        name: "tyler",
        address: "boston",
        phone: "555-555-5555"
    },
     secondary: [
        {key: "email", value: "tyler@test.com"}
     ],
     missing: ["age"]    
 }

Вот суть, включающая мое решение: https://gist.github.com/tilersmyth/26984866d7428c9b502ec8971d961997

Базовый процесс:

  1. Цикл по полям пользователя дляобновить ключи на основе ключей PrimaryField (если используется псевдоним) и зарегистрировать эти ключи (для проверки обязательных)
  2. Проверить наличие пропущенных обязательных полей
  3. Определить оставшиеся пользовательские поля, которые будут выдаваться как дополнительные элементы

Любое понимание подхода, который может быть более эффективным?

1 Ответ

0 голосов
/ 25 сентября 2018

Вы можете использовать Reduce для уменьшения массива до объекта или массива

const userFields = [
     {key: "name", value: "tyler"},
     {key: "location", value: "boston"},
     {key: "phone", value: "555-555-5555"},
     {key: "email", value: "tyler@test.com"}
 ];
 
 const primaryFields = [
    { key: "name", alias: ["nickname"], required: true },
    { key: "address", alias: ["location", "homebase"], required: true },
    { key: "age", alias: [], required: true },
    { key: "phone", alias: [], required: false },
    { key: "gender", alias: [], required: false }
 ];
 
const validate = (user, primary) => ({
  primary: user.reduce(
    (p, field) =>
      primary.find(f => field.key === f.key || f.alias.includes(field.key))
        ? { ...p, [field.key]: field.value }
        : p,
    {}
  ),
  secondary: user.reduce(
    (results, field) =>
      !primary.find(f => field.key === f.key || f.alias.includes(field.key))
        ? [ ...results, field ]
        : results,
    []
  ),
  missing: primary.reduce(
    (results, field) =>
      field.required && !user.find(f => f.key === field.key || field.alias.includes(f.key))
        ? [...results, field.key]
        : results,
    []
  )
});
 
 console.log(validate(userFields, primaryFields));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...