如何检查不可变映射的所有键是否都有值

时间:2021-04-19 15:21:15

标签: javascript reactjs functional-programming immutable.js

const [fieldValues, updateFieldValues] = useState(fromJS({
    imageName: '',
    tags: [],
    password: '',
  }));

const handleButtonClick = () => { 
  const res = // logic to find which field/fields are empty
}

我如何验证所有键是否都有值? ps:我有以下要求。

  1. 图像名称和密码至少应包含一个字符。
  2. 标签应至少包含一项。

2 个答案:

答案 0 :(得分:0)

您可以使用 Yup 一个 javascript 库来验证使用预定义架构的值。或者你可以写一个函数返回不符合要求的对象的键

自定义 JS 方法

  function validateObj(obj) {
let isValid = true;
const errorKeys = [];
Object.entries(obj).forEach(([key, value]) =>{
  if(!value) {
    errorKeys.push(key)
    isValid = false;
    return;
  }
  if(Array.isArray(value)) {
    if(!value?.length) {
      errorKeys.push(key)
    isValid = false;
    return;
    }
  }

})
return { isValid, errorKeys }
}

不可变的 JS 方法

 function validateObj(obj) {
    let isValid = true;
    const errorKeys = [];
    console.log(obj)
    obj.mapEntries(([key, value]) =>{
    console.log(key, value)
      if(!value) {
        errorKeys.push(key)
        isValid = false;
        return;
      }
      if(List.isList(value)) {
        if(!value.size) {
          errorKeys.push(key)
        isValid = false;
        return;
        }
      }

    })
    return { isValid, errorKeys }
    }

用法:

const handleButtonClick = () => { 
  const { isValid, errorKeys } = validateObj(obj);
  if(!isValid) {
    // SHOW ERROR MESSAGE HERE
  }
}

如有任何问题/疑问,请随时与我们联系

编辑: Link to example fiddle

答案 1 :(得分:0)

Immutable.js 集合是 Iterables,因此您可以对它们使用 for ... of 和其他常见交互。它还提供了多种查看数据的方式,例如 forEach, find, findKey, findValue, filter。看看docs,它们很好。下面是一些示例:

const thing = Immutable.fromJS({
  banana: 'scale',  
  imageName: '',
  tags: [],
  password: '',
});

for([key, val] of thing) {
 console.log('for of', key, ':', val);
}

thing.forEach((key, val) => {
  console.log('forEach', key, ':', val);
});

const firstItemIdoNotLike = thing.findKey((key, val) => {
  if(!!val) {
    return true;
  }
  if (val.hasOwnProperty('length')) {
    return val.length < 1;
  }
  return false;
});

if (firstItemIdoNotLike) {
  console.log('validation error on', firstItemIdoNotLike);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/4.0.0-rc.12/immutable.js"></script>

相关问题