javascriptjavascript-objects

JS rename an object key, while preserving its position in the object


My javascript object looks like this:

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

In attempting to rename a key (e.g. arr1), I end up deleting the existing key and writing a new key with the original value. The order of obj changes.

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

How do I rename a key while preserving the key order?


Solution

  • You might want to consider reducing the array of keys into a new object. To do this, you need also to know which key changed to what.

    1. Reduce the array of keys
    2. use a reducer which checks for a key change, and change it if necessary.
    3. add the key to the object with the value

    After that you have a Object with the order you had before, and possibly a changed key is still at the same position

    Something like this might work (not tested)

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

    As you can see, you need to keep track of how you changed a key (changedKeyMap). The reduce function just iterates over all keys in correct order and adds them to a newly created object. if a key is changed, you can check it in the changedKeyMap and replace it. It will still be at the correct position