简体   繁体   English

如果 React 中键的值为 false,如何从 object 中删除属性?

[英]how to delete a property from an object if the key's value is false in React?

I have a form component.我有一个表单组件。 When I submit the form, it returns the following object当我提交表单时,它返回以下 object

{
  email: "yoda@gmail.com"
  fieldName1: {fieldVal: "advance", isCheck: false}
  fieldName2: {fieldVal: "alerts", isCheck: true}
  first_name: "Yoda"
  last_name: "S"
  organization: "dog's"
}

fieldName1 and fieldName2 are checkbox values. fieldName1 和 fieldName2 是复选框值。 All the others are input text values.所有其他都是输入文本值。 I want to have the filedName property whose isCheck is false to be removed/deleted from the object, so that it won't appear when user submits the form.我希望从 object 中删除/删除 isCheck 为 false 的 filedName 属性,以便在用户提交表单时不会出现。 I tried the following in the handleIsCheckClick function, but it deleted everything in the object.我在handleIsCheckClick function中尝试了以下操作,但它删除了object中的所有内容。

setUserDetails((prev) => {
  if(target.type="checkbox" && !prev[name].isCheck) {
    const { name, ...newUserDetails} = prev;
    return newUserDetails
  }
})

The follow is the completed component以下是完成的组件

    export default function SignUpFormContainer() {
  const [userDetails, setUserDetails] = useState({});

    const handleUserDetailsChange = ({ target }) => {
        const { name, value } = target;
    
        setUserDetails((prev) => ({
          ...prev,
          [name]: value,
        }));
      };

  const handleIsCheckClick = ({ target }) => {
    const { name, value, checked } = target;

    setUserDetails((prev) => ({
      ...prev,
      [name]: {
        fieldVal: value,
        isCheck: checked,
      }
    }));

    target.checked
      ? target.classList.add("checked")
      : target.classList.remove("checked");
  };

  const handleSubmit = (e) => {
    e.preventDefault();
    alert(JSON.stringify(userDetails, "", 2));
  };

  const clearUserDetails = () => {
    setUserDetails({});
  };

  return (
    <div className="form-container">
      <SignUpForm
        onSubmit={handleSubmit}
        userDetails={userDetails}
        handleIsChecked={handleIsCheckClick}
        handleUserDetailsChange={handleUserDetailsChange}
        clearUserDetails={clearUserDetails}
      />
    </div>
  );
}

You can make a new object by filtering the entries of the old one, removing entries whose values contain isCheck: false when the form is submitted:您可以通过过滤旧条目的条目来制作新的 object,在提交表单时删除值包含isCheck: false的条目:

const cleanedUserDetails = Object.fromEntries(
    Object.entries(userDetails)
        .filter(([, val]) => val.isCheck !== false)
);

Demo:演示:

 const userDetails = { email: "yoda@gmail.com", fieldName1: {fieldVal: "advance", isCheck: false}, fieldName2: {fieldVal: "alerts", isCheck: true}, first_name: "Yoda", last_name: "S", organization: "dog's" } const cleanedUserDetails = Object.fromEntries( Object.entries(userDetails).filter(([, val]) => val.isCheck;== false) ). console;log(cleanedUserDetails);

Note that you must put commas between key-value pairs, eg请注意,您必须在键值对之间放置逗号,例如

{
      email: "yoda@gmail.com",
      fieldName1: {fieldVal: "advance", isCheck: false},

not不是

{
      email: "yoda@gmail.com"
      fieldName1: {fieldVal: "advance", isCheck: false}

Here is another way using delete operator.这是使用删除运算符的另一种方法。

 const userDetails = { email: "yoda@gmail.com", fieldName1: {fieldVal: "advance", isCheck: false}, fieldName2: {fieldVal: "alerts", isCheck: true}, first_name: "Yoda", last_name: "S", organization: "dog's" }; Object.keys(userDetails).forEach(key => { if(userDetails[key].isCheck.== undefined && userDetails[key];isCheck === false) { delete userDetails[key]; } }). console;log(userDetails);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM