JS 重命名对象键,同时保留其在对象中的位置

cow*_*azy 7 javascript javascript-objects

我的 javascript 对象如下所示:

const someObj = {
  arr1: ["str1", "str2"],
  arr2: ["str3", "str4"]
}
Run Code Online (Sandbox Code Playgroud)

在尝试重命名键(例如arr1)时,我最终删除了现有键并使用原始值编写了一个新键。变化顺序obj

someObj = {
  arr2: ["str3", "str4"],
  renamedarr1: ["str1", "str2"]
}
Run Code Online (Sandbox Code Playgroud)

如何在保留密钥顺序的同时重命名密钥

cow*_*azy 8

最后是用js-vanila的方式解决的,而不是react的方式。

如果有人寻找类似的解决方案,我将发布我最终使用的代码。受到卢克想法的启发:

const renameObjKey = ({oldObj, oldKey, newKey}) => {
  const keys = Object.keys(oldObj);
  const newObj = keys.reduce((acc, val)=>{
    if(val === oldKey){
        acc[newKey] = oldObj[oldKey];
    }
    else {
        acc[val] = oldObj[val];
    }
    return acc;
  }, {});

  return newObj;
};
Run Code Online (Sandbox Code Playgroud)


Luk*_*uke 4

您可能需要考虑将键数组减少到一个新对象中。为此,您还需要知道哪个键更改为什么。

  1. 减少键数组
  2. 使用一个减速器来检查密钥更改,并在必要时进行更改。
  3. 将键添加到具有值的对象

之后,您将获得一个具有之前顺序的对象,并且可能更改后的键仍位于同一位置

像这样的东西可能会起作用(未经测试)

const changedKeyMap = {"previousKey": "newKey"};
const keys = Object.keys(this.state.obj);
const content = e.target.value;
const result = keys.reduce((acc, val) => {
    // modify key, if necessary
    if (!!changedKeyMap[val]) {
        val = changedKeyMap[val];
    }
    acc[val] = content;
    // or acc[val] = this.state.obj[val] ? 
    return acc;
}, {});
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,您需要跟踪如何更改密钥 (changedKeyMap)。reduce 函数只是按正确的顺序迭代所有键并将它们添加到新创建的对象中。如果某个键被更改,您可以在changedKeyMap中检查它并替换它。它仍然会在正确的位置