代码之家  ›  专栏  ›  技术社区  ›  U Rogel

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

  •  7
  • U Rogel  · 技术社区  · 8 年前

    我的javascript对象如下所示:

    const someObj = {
      arr1: ["str1", "str2"],
      arr2: ["str3", "str4"]
    }
    

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

    someObj = {
      arr2: ["str3", "str4"],
      renamedarr1: ["str1", "str2"]
    }
    

    如何在 保留密钥顺序 ?

    2 回复  |  直到 6 年前
        1
  •  6
  •   U Rogel    8 年前

    最终,它是以js vanila的方式而非react的方式解决的。

    如果有人会寻找类似的解决方案,我会发布我最终使用的代码。灵感来自 Luke's 想法:

    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;
    };
    
        2
  •  4
  •   Luke    8 年前

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

    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;
    }, {});
    

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

    推荐文章