在js

时间:2016-04-08 20:28:40

标签: javascript arrays angularjs

所以,我需要将数组中的所有键从下划线转换为js中的camel空间。这是我在将表单发送到服务器之前需要做的事情。我使用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();
            });
        }
    })

在这里,我将尝试解释它是如何工作的,因为它起初看起来很糟糕。

underscoreToCamelcase函数只是将下划线中的任何字符串恢复为大小写,除了第一个字符(如此some_string => someString

所以,正如我之前所说的那样,我应该将所有关键字恢复为骆驼案,但正如你所知,我们不能简单地写

date[key] = underscoreToCamelcase(key)

所以keyReverse函数返回一个还原数组,这里是示例

some_key => value

将是

value => someKey

并且最后我简单地将键和值恢复,以获得此

someKey => value

但是,正如您已经了解的那样,我遇到了一个问题,如果在数组中存在相同的值,那么这些数据将会消失

阵列

some_key1 => valuesome_key2 => value

返回

someKey2 => value

那我怎么解决这个问题呢?我有一个建议,检查这些值是否存在,以及是否添加了一些特殊的子字符串,如此

some_key1 => valuesome_key2 => value

value => someKey1zx99value => someKey2

然后解析zx99,但我觉得我疯了...... 也许有人在这种情况下有更好的解决方案?

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

3 个答案:

答案 0 :(得分:4)

如果使用现有库来执行camelCase转换,则可以减少像这样的对象

import {camelCase} from 'lodash/string'

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

答案 1 :(得分:1)

.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

答案 2 :(得分:0)

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

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才能获得该对象。