将对象键从下划线格式更改为驼峰格式

时间:2018-11-24 08:15:18

标签: javascript

我正试图得到这个:

  const obj = {
    keyFirst: 'firstVal',
    keySecond: 'secondVal',
  };

从这里:

  const obj = {
    key_first: 'firstVal',
    key_second: 'secondVal',
  };

...因此将下划线键格式更改为camelCase格式。

我试图通过使用reduce函数来实现它:

  const renameKeys = obj => Object
    .keys(obj)
    .reduce((acc, key) => {
      const modifiedKey = key.replace(/_([a-z])/g, function f(g) {
        return g[1].toUpperCase();
      });
      return ({
        ...acc,
        ...{ [modifiedKey]: obj[key] },
      }, {});
    });

  console.log(renameKeys(obj));

但是这将无法工作并返回空对象。如何更改它以实现我的目标?

2 个答案:

答案 0 :(得分:2)

问题是

  return ({
    ...acc,
    ...{ [modifiedKey]: obj[key] },
  }, {});

您无意中使用了逗号运算符-尽管对新对象进行了评估,但括号内的整个表达式的取值为逗号分隔列表中的最终值,这是一个空对象,它将在下一次迭代时成为累加器。

请勿在{{1​​}}中使用逗号运算符,而应将return作为第二个参数传递给{}

reduce

此外,您可能会考虑使用 const obj = { key_first: 'firstVal', key_second: 'secondVal', }; const renameKeys = obj => Object .keys(obj) .reduce((acc, key) => { const modifiedKey = key.replace(/_([a-z])/g, function f(g) { return g[1].toUpperCase(); }); return ({ ...acc, ...{ [modifiedKey]: obj[key] }, }); }, {}); console.log(renameKeys(obj));,而不是使用Object.keys,因为Object.entries可能比[modifiedKey]: value更清晰:

[modifiedKey]: obj[key]

答案 1 :(得分:0)

您可以按组划分密钥名称,并使用$1$2代表组

const obj = {
  keyFirst: 'firstVal',
  keySecond: 'secondVal',
};


let newObj = {}


for (let keys in obj) {
  newObj[keys.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase()] = obj[keys]

}

console.log(newObj)