Javascript 在js中将数组中的所有键从下划线转换为驼峰大小写

Javascript 在js中将数组中的所有键从下划线转换为驼峰大小写,javascript,arrays,angularjs,Javascript,Arrays,Angularjs,所以,我需要在js中将数组中的所有键从下划线转换为驼峰空间。这就是我在将表单发送到服务器之前需要做的事情。我使用的是Angular.js,我想将其表示为一个过滤器(但我认为在这种情况下它并不重要)。不管怎样,这是我创建的一个函数 .filter('underscoreToCamelKeys', function () { return function (data) { var tmp = []; function keyReve

所以,我需要在js中将数组中的所有键从下划线转换为驼峰空间。这就是我在将表单发送到服务器之前需要做的事情。我使用的是
Angular.js
,我想将其表示为一个过滤器(但我认为在这种情况下它并不重要)。不管怎样,这是我创建的一个函数

.filter('underscoreToCamelKeys', function () {
        return function (data) {

            var tmp = [];
            function keyReverse(array) {
                angular.forEach(array, function (value, key) {
                        tmp[value] = underscoreToCamelcase(key);
                });

                return tmp;
            }

            var new_obj = {};
            for (var prop in keyReverse(data)) {
                if(tmp.hasOwnProperty(prop)) {
                    new_obj[tmp[prop]] = prop;
                }
            }
            return new_obj;
        };

        function underscoreToCamelcase (string) {
            return string.replace(/(\_\w)/g, function(m){
                return m[1].toUpperCase();
            });
        }
    })
在这里,我将尝试解释它是如何工作的,因为它一开始看起来很糟糕

sublineToCamelCase
函数只需将下划线中的任何字符串还原为大小写,第一个字符除外(如
some\u string=>someString

所以,正如我前面所说的,我应该将所有键还原为camel case,但正如您所理解的,我们不能简单地编写

date[key] = underscoreToCamelcase(key)
所以
keyReverse
函数返回一个还原的数组,下面是一个示例

some_键
=>

将是

value
=>
someKey

最后,我简单地将键和值还原回来,得到这个

someKey
=>
value

但是,正如您可能已经理解的,我遇到了一个问题,如果数组中存在相同的值,那么这些数据将不相似

排列

某些键1
=>
some_-key2
=>
value

返回为

someKey2
=>
value

那我该怎么解决呢?我有一个建议,检查这些值是否存在,是否需要添加一些特殊的子字符串,如下所示

某些键1
=>
some_-key2
=>
value

value
=>
someKey1
zx99value
=>
someKey2

毕竟是为zx99解析的,但我觉得我快疯了。。。 也许有人有更好的解决办法

重要!他们的主要问题不仅仅是将一些字符串转换成驼峰大小写,而是使用数组键

.filter('underscoreToCamelKeys', function () {
        return function (data) {

            var tmp = {};
            angular.forEach(data, function (value, key) {
                var tmpvalue = underscoreToCamelcase(key);
                tmp[tmpvalue] = value;
            });

            return tmp;
        };

        function underscoreToCamelcase (string) {
            return string.replace(/(\_\w)/g, function(m){
                return m[1].toUpperCase();
            });
        }
    })

多亏了ryanlutgen作为替代解决方案,您可以使用
JSON.stringify
方法的可选
replacer
参数

var result = JSON.stringify(myVal, function (key, value) {

  if (value && typeof value === 'object') {
    var replacement = {};
    for (var k in value) {
      if (Object.hasOwnProperty.call(value, k)) {
        replacement[underscoreToCamelcase(k)] = value[k];
      }
    }
    return replacement;
  }

  return value;
});

当然,您最终将得到一个字符串,并且必须调用
JSON.parse
来获取该对象。

如果您使用现有库进行camelCase转换,那么您可以这样减少一个对象

import {camelCase} from 'lodash/string'

const camelCaseKeys = (obj) =>
  Object.keys(obj).reduce((ccObj, field) => ({
    ...ccObj,
    [camelCase(field)]: obj[field]
  }), {})

一种解决方案是使用完全符合您需要的方法。事实并非如此,因为问题在于将数组键还原为驼峰大小写,而不是仅对字符串进行驼峰化,我已经创建了一个函数来驼峰化字符串
下划线camelcase
var str=“under_score”,rep=str.replace(/_([a-z])/,function(match,p1){返回p1.toUpperCase();});//伙计们,我的下划线到camelcase函数工作得很好,即名为
下划线到camelcase
,问题是还原数组键为什么首先要切换键/值对?为什么不在执行时替换键?例如,提取值和键,删除当前键,在转换后的keyThis不处理嵌套的json对象
[camelCase(字段)]:typeof obj==“object”?camelCaseKeys(obj[field]):obj[field]
可以做到这一点。嵌套对象的示例非常好,但会停止值。下面的工作: