从snake_case修改json密钥的简单方法来封装camelCase

时间:2017-03-23 09:27:15

标签: javascript json node.js

我有很多json解析,我收到的所有json都有像user_name这样的蛇案例中的密钥。对于解析,我需要像userName这样的驼峰案例。

示例json文件如下所示:

[{
   "user_id" : 1,
   "user_name" : "Abcd"
},
{
   "org_id" : 11,
   "org_name" : "some_name"
}
...
]

预期产出:

[{
   "userId" : 1,
   "userName" : "Abcd"
},
{
   "orgId" : 11,
   "orgName" : "some_name"
}
...
]

我收到的json没有任何特定的固定符号,它可以是任何东西。但所有的钥匙都是蛇形的。我需要将它转换为camelCase。

我不能做的是查找和替换,因为它也会替换值中的蛇套管字符串。

有没有简单的方法可以做同样的事情?

5 个答案:

答案 0 :(得分:1)

您可以使用名为camelcase-keys-deep

的npm包

https://www.npmjs.com/package/camelcase-keys-deep

答案 1 :(得分:1)

您可以执行以下操作:

var keys = [];//this will contain the json with desired output
for(var i = 0;i<myObj.length;i++)//myObj is the variable that contains your json
{
    Object.keys(myObj[i]).forEach(function(key){
        if(keys.indexOf(key) == -1)
        {
            var newValue = {};
            var value = myObj[i][key];
            key = key.replace(/_([a-z])/g, function (g) { return g[1].toUpperCase(); });
            newValue[key] = value;
            keys.push(newValue);
        }   
    });

}
//console.log(keys);

希望这会有所帮助:)

答案 2 :(得分:0)

&#13;
&#13;
var arr = [{
    "user_id": 1,
    "user_name": "Abcd"
  },
  {
    "org_id": 11,
    "org_name": "some_name"
  }
];

arr.forEach(a => {
  Object.keys(a).forEach(k => {
    newK = k.replace(/(\_\w)/g, (m) => m[1].toUpperCase());
    a[newK] = a[k];
    delete a[k];
  });
});

console.log(arr);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

所以AKSHAY JAIN的实现非常可靠,但它会删除不属于snake的属性。我修复了实现。

var arr = [{
  "user_id": 1,
  "user_name": "Abcd"
},
{
  "org_id": 11,
"org_name": "some_name"
},
{
  "personId": 12,
  "personName": "otherName"
}];

arr.forEach(a => {
    Object.keys(a).forEach(k => {
      newK = k.replace(/(\_\w)/g, (m) => m[1].toUpperCase());
      if (newK != k) {
        a[newK] = a[k];
        delete a[k];
      }
    });
  });

console.log(arr);

答案 4 :(得分:0)

如果您使用lodash,我会为此建议我的解决方案:

snake_case-> camelCase

function camelCaseDeep(anything) {
  const thing = _.cloneDeep(anything);

  if (
    _.isEmpty(thing) ||
    (!_.isObject(thing) && !_.isArray(thing))
  ) {
    return thing;
  }

  if (_.isArray(thing)) {
    const arr = thing;
    return arr.map(el => camelCaseDeep(el))
  }

  // thing can be only not empty object here
  const objWithMappedKeys = _.mapKeys(thing, (value, key) => _.camelCase(key));
  const objWithMappedValues = _.mapValues(objWithMappedKeys, value => camelCaseDeep(value));

  return objWithMappedValues;
}

camelCase-> snake_case

function snakeCaseDeep(anything) {
  const thing = _.cloneDeep(anything);

  if (
    _.isEmpty(thing) ||
    (!_.isObject(thing) && !_.isArray(thing))
  ) {
    return thing;
  }

  if (_.isArray(thing)) {
    const arr = thing;
    return arr.map(el => snakeCaseDeep(el))
  }

  // thing can be only not empty object here
  const objWithMappedKeys = _.mapKeys(thing, (value, key) => _.snakeCase(key));
  const objWithMappedValues = _.mapValues(objWithMappedKeys, value => snakeCaseDeep(value));

  return objWithMappedValues;
}