所以,我需要将数组中的所有键从下划线转换为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
=> value
,
some_key2
=> value
返回
someKey2
=> value
那我怎么解决这个问题呢?我有一个建议,检查这些值是否存在,以及是否添加了一些特殊的子字符串,如此
some_key1
=> value
,
some_key2
=> value
value
=> someKey1
,
zx99value
=> someKey2
然后解析zx99,但我觉得我疯了...... 也许有人在这种情况下有更好的解决方案?
重要!它的主要问题不仅仅是将一些字符串转换为驼峰大小写,而是使用数组键进行转换!
答案 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
才能获得该对象。