2

我试图得到这个:

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

由此:

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

...所以将下划线键格式更改为驼峰格式。

我试图通过使用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));

但这不起作用并返回空对象。我怎样才能改变它以实现我的目标?

4

2 回答 2

2

问题是

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

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

不要在 , 中使用逗号运算符,而是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]

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

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

console.log(renameKeys(obj));

于 2018-11-24T08:19:12.740 回答
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)

于 2018-11-24T08:23:30.590 回答