重命名对象中的一些键

Rename some keys in an object

我有一个包含多个键和值的对象。

我只想重命名一些键而不是全部。对于我所做的,它不会返回对象中的其余键值对:

data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"}; 

keyMap = {key1: "firstkey", key2: "secondkey"};

mappedData = Object.keys(keyMap).reduce((obj,k) => Object.assign(obj, { [keyMap[k]]: data[k] }),{});

console.log(mappedData);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

如何返回:

{
  firstkey: "value1",
  secondkey: "value2",
  key3: "value3", 
  key4: "value4"
}

您可以通过检查 keyMap 获取条目并替换密钥,然后获取新密钥或使用旧密钥。

let data =  { key1: "value1", key2: "value2", key3: "value3", key4: "value4" }; 
    keyMap = { key1: "firstkey", key2: "secondkey" },
    mappedData = Object.fromEntries(
        Object
            .entries(data)
            .map(([key, value]) => [key in keyMap ? keyMap[key] : key, value])
    );

console.log(mappedData);

也许是这样的:

const changeKeys = (keyMap) => (obj) =>
  Object .fromEntries (Object .entries (obj) .map (([k, v]) => [keyMap[k] || k, v]))

const data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"}; 
const keyMap = {key1: "firstkey", key2: "secondkey"};

console .log(
  changeKeys (keyMap) (data)
)

Object.entriesObject.fromEntriesmap 或中间的其他转换一起使用可以解决各种对象操作问题。

如果 Object.fromEntries is not available 适合您的环境,则很容易填充。

您可以使用 for 循环一次完成

data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"}; 

keyMap = {key1: "firstkey", key2: "secondkey"};

const isDefined = x => typeof x !== 'undefined'

const renameKeys = o => {
  const newObj = {}
  for (const key in o) {
    if (isDefined(keyMap[key])) {
      newObj[keyMap[key]] = o[key]
    } else {
      newObj[key] = o[key]
    }
  }
  return newObj
}

console.log(
  renameKeys(data)
)

我会遍历数据并查看是否存在密钥。如果确实使用它,如果不使用原始密钥。

var data = {
  key1: "value1",
  key2: "value2",
  key3: "value3",
  key4: "value4"
};

var keyMap = {
  key1: "firstkey",
  key2: "secondkey"
};


const updated = Object.entries(data).reduce((obj, [key, value]) => {
  const updatedKey = keyMap[key] || key
  obj[updatedKey] = value
  return obj
}, {})

console.log(updated);

这是您的代码,稍作更新:

data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"}; 

keyMap = {key1: "firstkey", key2: "secondkey"};

mappedData = Object.keys(data).reduce((obj,k) => Object.assign(obj, { [keyMap[k] || k]: data[k] }),{});

console.log(mappedData);

问题是您的 reduce 函数中的累加器是一个新的空对象,您只是迭代要更改的键。

有很多方法可以完成您想要做的事情。我个人发现 reduce 难以解析,所以我会跳过它并执行如下操作:

const data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"}; 

const keyMap = {key1: "firstkey", key2: "secondkey"};

const mappedData = {};
for(const key of Object.keys(data)){
  // Use the renamed key if it exists, else fall back on the original key
  mappedData[ keyMap[key] || key ] = data[ key ];
}

console.log(mappedData);

如果您真的想这样做,您可以将相同类型的逻辑应用于 reduce,方法是遍历原始数据而不是键盘映射:

const data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"}; 

const keyMap = {key1: "firstkey", key2: "secondkey"};

mappedData = Object.keys(data).reduce((obj,k) => Object.assign(obj, { [keyMap[k] || k]: data[k] }),{});

console.log(mappedData);