当前位置: 首页 > 知识库问答 >
问题:

将对象结果复制到引用问题

夏宏旷
2023-03-14

我试图通过这样做来创建现有对象的副本。不知何故,我总是通过引用而不是作为一个新对象创建一个副本。

    const fieldSchema = [
        {
            addressType: '',
            addressSuffix: '',
            addressStreet: '',
            addressPostalcode: '',
            addressLocation: '',
            addressCountry: 'Germany',
        },
    ];

    //State
    const [inputFields, setInputFields] = useState(fieldSchema);


    const handleMenuItemCopy = (event, index) => {
        const fields = [...inputFields];
        console.log('Existing Item(s):', inputFields);
        const duplicatedField = fields.splice(index, 1);
        console.log('Copied Item:', duplicatedField);

        const newFields = [...inputFields, ...duplicatedField];
        console.log(newFields);
        setInputFields(newFields);
    };


return (
    <>
     {inputFields.map((inputField, index) => (
         ...
         <TextField
            id={`addressPostalcode-${index}`}
            name="addressPostalcode"
            variant="outlined"
            label="Postleitzahl"
            className={classes.input}
            onChange={(event) => handleInputChange(event, index)}
            value={inputField.addressPostalcode}
         ></TextField>
         ...
     }

     <Button
       classes={{
         root: classes.buttonBase,
         startIcon: classes.buttonStartIcon,
       }}
       variant="outlined"
       onClick={(event) => handleMenuItemCopy(event, index)}
    >
      Duplicate Fields
    </Button>
  </>
)

  1. 在任何输入中输入一些数据
  2. 单击右上方的按钮
  3. 选择重复rn(重复)
  4. 编辑副本的一个字段
  5. 更改也会立即在第一个对象字段集中执行操作。

共有1个答案

邬飞捷
2023-03-14

您需要复制实际的对象。splice并不这样做,它只是将它从数组中移除(我认为您不想这样做)。

这将在index处复制对象,并在结尾处添加副本:

const handleMenuItemCopy = (event, index) => {
    // Use the callback form
    setInputFields(fields => {
        // Copy the array; the objects within it are still shared
        fields = [...fields];
        // Copy the one that's at `index` and push at the end
        fields.push({...fields[index]});
        // Return the new array
        return fields;
    });
};

这是一个简单的副本,这通常是你所需要的,但如果你需要做一个深层副本,请看这个问题的答案。

 类似资料:
  • 问题内容: 我正在使用以下内容将检索到的值添加到类中。所有值都将添加到该类的属性中,但是我正在使用compisition(在类中具有class的对象),并且在输出中不显示任何内容。 地址类别如下: 问题答案: 像这样的作品: 将ResultSet行转换为JavaBean。此实现使用反射和BeanInfo类将列名与bean属性名匹配。属性根据以下几个因素与列匹配: 该类具有与列同名的可写属性。名称比

  • 与原始类型相比,对象的根本区别之一是对象是“通过引用”被存储和复制的,与原始类型值相反:字符串,数字,布尔值等 —— 始终是以“整体值”的形式被复制的。 如果我们稍微看一下复制值时发生了什么,就很容易理解了。 让我们从原始类型开始,例如一个字符串。 这里我们将 message 复制到 phrase: let message = "Hello!"; let phrase = message; 结果我

  • 我已经成功地完成了在Amazon EMR上的工作,现在我想将结果从复制到,但是我遇到了一些问题 这是代码(--steps) 这是日志:

  • 问题内容: 我有几个Javascript原型。最初,实例将仅填写ID,并带有一些其他数据的通用占位符信息。然后,我使用ID和对象类型(使用jQuery的AJAX函数)向服务器发送一条消息,然后服务器返回一个JSON对象,其中包含所有缺少的信息(但没有ID)。返回的对象中的变量与现有对象中的变量名称完全相同。 将其转移到现有的空对象中最简单的方法是什么?我想出了几种选择 将对象设置为等于返回的对象,

  • 我有一个用户类,有16个属性,比如名字,姓氏,出生日期,用户名,密码等...这些都存储在MySQL数据库中,当我想要检索用户时,我使用ResultSet。我想将每一列映射回用户属性,但我这样做的效率似乎非常低。例如,我正在做: 也就是说,我检索所有的列,然后通过将所有的列值插入用户构造函数来创建用户对象。 有人知道更快、更整洁的方法吗?

  • 问题内容: 我正在上最后一堂课。我复制的阵列使用对象,并且当我改变一个中复制的数组对象,它就会被反映原始数组英寸 我正在输出, 我应该在所有情况下都得到25和26的输出,对吗?为什么会改变? 问题答案: System.arrayCopy()复制对象还是对对象的引用? 参考,这是一个 浅表 副本。出乎意料的是,文档没有明确地说,只是隐式地说,因为他们 只 谈论复制数组元素,而不是递归地复制他们引用的