Убедитесь, что объект соответствует модели данных - PullRequest
0 голосов
/ 12 апреля 2019

Представьте, что у меня есть модель данных, подобная этой:

// Pseudo-code, as I don't know how to achieve this
const Model = {
    name: String.required,
    description: String.optional,
    rank: Number.required,
    // ...
}

По сути, это означает, что у объекта должно быть свойство name, а должно быть String.Свойство description является необязательным , но должно быть String, если оно определено.И т. Д.

Теперь, скажем, у меня есть набор объектов:

const obj1 = {
    name: 'Object 1',
    rank: 1,
}
const obj2 = {
    description: 'This is object 2',
    rank: 2,
}

Чтобы сохранить мои объекты в базе данных NoSQL (Firestore Firebase), я хотел бы быть уверенчто каждый Object соответствует Model.Это предотвратит пропущенные поля, например.

В моем примере obj1 должно пройти, но obj2 не должно иметь свойства name отсутствует.

И есть лиспособ добавить в сообщение об ошибке, какие свойства отсутствуют?

1 Ответ

0 голосов
/ 12 апреля 2019

Решение:

Вы можете создать простую функцию, которая будет проверять ваши модели на основе массива обязательных и дополнительных параметров.

Примечание : ниже приведены параметры required и optional, жестко закодированные в функции, но вы также можете передать их без особых усилий и изменения кода. Просто удалите объявления и добавьте их в качестве параметров в функцию.


код

function validateModel(obj) {
  let
    // parameters specification
    required = ["name", "rank"],
    optional = ["description"],

    // helper methods
    toObjects = (a, v) => Reflect.has(obj, v) ? (a[v] = obj[v], a) : a,
    grab = (type) => type.reduce(toObjects, {}),
    payload = () => Object.assign(grab(required), grab(optional)),
    notValid = v => !Reflect.has(obj, v);

  //output
  if (required.some(notValid)) return false;
  return payload();
}

Рабочий пример:

//setup
let log = (x) => { return console.log(x), log };
const Model={name:"n",description:"d",rank:"r"},Model2={rank:"a"},Model3={rank:"b",name:"b"};

// Validation Method:
function validateModel(obj) {
  let
    // parameters specification
    required = ["name", "rank"],
    optional = ["description"],

    // helper methods
    toObjects = (a, v) => Reflect.has(obj, v) ? (a[v] = obj[v], a) : a,
    grab = (type) => type.reduce(toObjects, {}),
    payload = () => Object.assign(grab(required), grab(optional)),
    notValid = v => !Reflect.has(obj, v);

  //output
  if (required.some(notValid)) return false;
  return payload();
}


// Examples:
log
  (validateModel(Model) || "Invalid Model")
  (validateModel(Model2) || "Invalid Model")
  (validateModel(Model3) || "Invalid Model")

Делая это многоцелевым:

Если вы создадите что-то вроде средства проверки моделей, было бы лучше иметь возможность проверять с его помощью несколько типов моделей. Приведенный ниже код создает конструктор, который принимает объект, полный структур. Каждая структура содержит массив параметров required и optional.

Конструктор ModelChecker возвращает объект с одним методом, validate. Передав объект, который вы хотите проверить, и имя структуры модели, с которой вы хотите проверить, вы можете определить, является ли модель действительной.


Рабочий пример:

//setup
let log = (x) => { return console.log(x), log };
const Model={name:"n",description:"d",rank:"r"},Model2={rank:"a"},Model3={rank:"b",name:"b"}, Car={"color":"black", "name": "toyota" }, Car2={"name":"chevy"};

//setup validation structures
const structs = {
  "identity": {
    required: ["name", "rank"],
    optional: ["description"]
  },
  "car": {
    required: ["color"],
    optional: ["name"]
  }
}

// model checker constructor
function ModelChecker(structs) {
  let proto = {
    structs
  };
  
  proto.validate = function validateModel(obj, struct) {
    if (!this.structs[struct]) return false;

    let
      // parameters specification
      required = this.structs[struct].required,
      optional = this.structs[struct].optional,

      // helper methods
      toObjects = (a, v) => Reflect.has(obj, v) ? (a[v] = obj[v], a) : a,
      grab = (type) => type.reduce(toObjects, {}),
      payload = () => Object.assign(grab(required), grab(optional)),
      notValid = v => !Reflect.has(obj, v);

    //output
    if (required.some(notValid)) return false;
    return payload();
  }

  return proto;
}

// Examples:

let mc = ModelChecker(structs);
log
  (mc.validate(Model, "identity") || "Invalid Model")
  (mc.validate(Model2, "identity") || "Invalid Model")
  (mc.validate(Model3, "identity") || "Invalid Model")
  (mc.validate(Car, "car") || "Invalid Model")
  (mc.validate(Car2, "car") || "Invalid Model")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...