Javascript 从阵列克隆或复制对象,然后使用es6推送和重命名

Javascript 从阵列克隆或复制对象,然后使用es6推送和重命名,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我想有一个列表组件,它有操作编辑,复制或删除。 我已经选择了要克隆的id,但它没有推到项目旁边。 我正在使用es6 这是我的密码 const [state, setState] = useState({ formList: [] }) const handleDuplicateItem = id => { const duplicateSource = [...state.formList]; const duplicateItem = duplicateSource.fin

我想有一个列表组件,它有操作编辑,复制或删除。 我已经选择了要克隆的id,但它没有推到项目旁边。 我正在使用es6

这是我的密码

const [state, setState] = useState({
  formList: []
})

const handleDuplicateItem = id => {
  const duplicateSource = [...state.formList];
  const duplicateItem = duplicateSource.find(item => item.id !== id);
  duplicateSource.push(duplicateItem);

  setState({
    ...state,
    formList: [duplicateSource],
  });
};

<FormItemList
  dataSource={state.formList}
/>

您希望副本位于您复制的项目旁边请注意,您现在有重复的id,并且在没有警告的情况下无法将数据映射到jsx

您可以使用reduce执行以下操作:

const handleDuplicateItem = id => {
  setState({
    ...state,
    formList: state.formList.reduce((result, item) => {
      if (item.id === id) {
        //push an extra shallow copy of the item to result
        result.push({ ...item });
      }
      result.push(item);
      return result;
    }, []),
  });
};

你什么意思不推旁边的项目?如果你的意思是重复项总是在数组的末尾,那就是推送的作用。@jornsharpe例如,[1,1,2,3]1是克隆项。那么为什么要推送呢?这总是增加了结局。看,例如。