Search code examples
javascriptecmascript-5ecma

Validation rule for object like array


I have been suffering from an issue. What I want to do is adding some validation rule for my data. The example of data is written below.

const data = [
    { name: 'Benz', class: 'Car', grade: 'A', isDefault: true },
    { name: 'BMW', class: 'Car', grade: 'B', isDefault: true },
    { name: 'Ford', class: 'Car', grade: 'C', isDefault: true },
    { name: 'Hyundai', class: 'Car', grade: 'C', isDefault: true },
    { name: 'Kia', class: 'Car', grade: 'C', isDefault: true },
    { name: 'Mustang', class: 'Car', grade: 'D', isDefault: true },
    { name: 'Zeep', class: 'Car', grade: 'E', isDefault: true },
    { name: 'Andy', class: 'Boat', grade: 'A', isDefault: true },
    { name: 'Tommy', class: 'Boat', grade: 'B', isDefault: true },
    { name: 'Judy', class: 'Boat', grade: 'C', isDefault: true },
    { name: 'John', class: 'Boat', grade: 'D', isDefault: true },
    { name: 'James', class: 'Boat', grade: 'E', isDefault: false },
    { name: 'Romio', class: 'Boat', grade: 'F', isDefault: false },
    { name: 'Michael', class: 'Boat', grade: 'F', isDefault: false },
    { name: 'Ron', class: 'Boat', grade: 'F', isDefault: false },
]

[ Valiation Rule ]

If 'class' and 'grande' are same, it must have one default value (isDefault = true), but default value can not over 1

Maybe it'll be hard to understand this rule. Let's say, Hyundai's case. Hyundai can default value of class 'Car' and grade 'C'. But there are another default value 'Ford' and 'Kia' in class 'Car' && grade 'C'. So, the result of validation is fail.

Let's say class 'Boat' && grade 'F' case. There are no default value that assigned this case. So, the result of validation is fail.

Thank you in advance.


Solution

  • Below is one possible way to achieve the target.

    Code Snippet

    // method to validate given class-grade combination
    const myValidate = (pClass, pGrade, arr) => {
      // first determine if any data matches the class-grade combination
      const filterData = arr.filter(
        obj => (
          obj.class === pClass &&
          obj.grade === pGrade
        )
      );
      // if yes (ie, class-grade combination exists),
      if (filterData.length > 0) {
        // count how many "isDefault" with value "true" exists
        const defaultTrueCount = filterData.filter(({ isDefault }) => !!isDefault).length;
        // if exactly 1 "isDefault" with value "true", then test "pass"-ed
        // else, "fail"-ed
        if (defaultTrueCount === 1) return 'Pass'
        else return 'Fail';
      } else {
        // no data matched - so case is neither pass nor fail
        return `class: ${pClass} and grade: ${pGrade} combination not found in data`;
      }
    };
    
    const data = [
        { name: 'Benz', class: 'Car', grade: 'A', isDefault: true },
        { name: 'BMW', class: 'Car', grade: 'B', isDefault: true },
        { name: 'Ford', class: 'Car', grade: 'C', isDefault: true },
        { name: 'Hyundai', class: 'Car', grade: 'C', isDefault: true },
        { name: 'Kia', class: 'Car', grade: 'C', isDefault: true },
        { name: 'Mustang', class: 'Car', grade: 'D', isDefault: true },
        { name: 'Zeep', class: 'Car', grade: 'E', isDefault: true },
        { name: 'Andy', class: 'Boat', grade: 'A', isDefault: true },
        { name: 'Tommy', class: 'Boat', grade: 'B', isDefault: true },
        { name: 'Judy', class: 'Boat', grade: 'C', isDefault: true },
        { name: 'John', class: 'Boat', grade: 'D', isDefault: true },
        { name: 'James', class: 'Boat', grade: 'E', isDefault: false },
        { name: 'Romio', class: 'Boat', grade: 'F', isDefault: false },
        { name: 'Michael', class: 'Boat', grade: 'F', isDefault: false },
        { name: 'Ron', class: 'Boat', grade: 'F', isDefault: false },
    ];
    
    console.log('validate class: Car, grade: C | result: ', myValidate('Car', 'C', data));
    console.log('validate class: Boat, grade: F | result: ', myValidate('Boat', 'F', data));
    console.log('validate class: Car, grade: A | result: ', myValidate('Car', 'A', data));
    .as-console-wrapper { max-height: 100% !important; top: 0 }

    Explanation

    Inline comments added in the snippet above.