Проверьте поля объекта на соответствие данных указанным условиям на нативном JavaScript - PullRequest
0 голосов
/ 16 октября 2019

У меня нет опыта работы с javascript. И лучший способ решения этой проблемы мне не ясен. У меня есть родной JavaScript, у меня есть объект, и мне нужно проверить поля объекта на соответствие заданным условиям.

Я сразу же сделал простой вариант, используя «IF»

Но ядумаю, что это очень плохое решение. Как это можно сделать лучше?

    let user = {
    name: 'test',
    nickname: 'Doe',
    age: 25,
    skills: {
        skill1: 'go',
        skill2: 'php',
        skill3: 'best of the best'
    }
};
let checkField = (obj) => {
    if (
        typeof (obj.name) === 'string' &&
        typeof (obj.nickname) === 'string' &&
        obj.age >= 16 && obj.age <= 50 &&
        Object.keys(obj).length > 0
    ) {
        console.log('true')
    } else {
        console.log('false')
    }
};
checkField(user);

Условия

let user = {
    name: 'test',   == string
    nickname: 'Doe', == string
    age: 25,  number in range 16..50
    skills: { not empty object
        skill1: 'go',  == string
        skill2: 'php',  == string
        skill3: 'best of the best'  == string
    }
};

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Нет ничего плохого в том, что вы пытаетесь сделать, хотя вы упускаете пару вещей в соответствии с заданными условиями -

  1. Проверка типа age для number и
  2. obj.skills вместо obj, чтобы проверить, не является ли он пустым.

Здесь будет полный исправленный код в соответствии с условиями -

 let user = {
    name: 'test',
    nickname: 'Doe',
    age: 25,
    skills: {
        skill1: 'go',
        skill2: 'php',
        skill3: 'best of the best'
    }
};
let checkField = (obj) => {
    if (
        typeof obj.name === 'string' &&
        typeof obj.nickname === 'string' &&
        typeof obj.age === 'number' &&
        obj.age >= 16 && obj.age <= 50 &&
        obj.skills && Object.keys(obj.skills).length > 0
    ) {
        console.log('true')
    } else {
        console.log('false')
    }
};
checkField(user);

Кроме того, если вы также хотите проверить, что каждое свойство skills имеет тип string, вы можете выполнить итерацию по объекту и проверить его следующим образом-

Object.keys(obj.skills).every(x => typeof(obj.skills[x])==='string')

Вот документация для Array.every ()

0 голосов
/ 16 октября 2019

Я бы сказал, что, возможно, стоит изучить библиотеку / модуль валидации, такие как hai's joi. Вот пример того, как вы могли бы извлечь все вещи с ним неправильно. Например, добавьте следующий код для ввода по этой ссылке: https://npm.runkit.com/@hapi/joi

const schema = Joi.object().keys({
  name: Joi.string(),
  nickname: Joi.string(),
  age: Joi.number(),
  skills: Joi.object().min(1)
})
console.log(schema.validate({
    name: 'test',
    nickname: 'Doe',
    age: 25,
    skills: {
        skill3: 'best of the best'
    }
}))
console.log(schema.validate({
    name: 'test',
    nickname: 'Doe',
    age: 25,
    skills: {
    }
}))

Вы можете найти полный документ API здесь: https://github.com/hapijs/joi/blob/master/API.md

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...