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

Posted

技术标签:

【中文标题】如何检查不可变映射的所有键是不是都有值【英文标题】:how to check if all the keys of a immutable map have value如何检查不可变映射的所有键是否都有值 【发布时间】:2021-07-13 19:33:31 【问题描述】:
const [fieldValues, updateFieldValues] = useState(fromJS(
    imageName: '',
    tags: [],
    password: '',
  ));

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


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

    imageName 和 password 至少应包含一个字符。 标签应至少包含一项。

【问题讨论】:

您可以将length 属性用于字符串和数组。 [].length == 0"".length == 0。具有至少一个字符或元素的字符串或数组的length 大于零 【参考方案1】:

您可以使用 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

【讨论】:

@Sumanth Madishetty 你好。我非常感谢您的宝贵反馈,但我实际上在 React.js 项目中使用了一个名为 immutable.js 的库。 immutable-js.github.io/immutable-js/docs/# @noobBokhonto 已经用 immutable-js 更新了答案【参考方案2】:

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);
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/4.0.0-rc.12/immutable.js"&gt;&lt;/script&gt;

【讨论】:

以上是关于如何检查不可变映射的所有键是不是都有值的主要内容,如果未能解决你的问题,请参考以下文章

如何检查对象是不是不可变?

对String值不可变的理解以及String类型的引用传递问题

python字典

java中一个类是不可变类的条件是啥?求详细解答。

Map-HashMap-LinkedHashMap-Map.Entry-Collections-可变参数

Python3-内置数据类型-映射类型