我正在检查JavaScript对象中的属性,通过删除前缀“element”并将新值保存在另一个对象中来替换某些键。
var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
key = keys[j].replace("element_", "");
switch(key) {
default :
tmp[key] = json[key];
break;
}
}
问题在于,当我这样做时,我可以记录所有键,它们具有正确的名称,但是当我尝试设置与这些键相关联的值时,它们是未定义的(json [key])。
这是因为我将密钥(Objects
)转换为Strings
(使用replace
方法)吗?
答案 0 :(得分:24)
我们会写一个小功能来按照你想要的方式修复密钥。
function fix_key(key) { return key.replace(/^element_/, ''); }
_.object(
_.map(_.keys(json), fix_key),
_.values(json)
)
var keys = Object.keys(json);
var result = {};
for (i = 0; i < keys.length; i++) {
var key = keys[i];
result[fix_key(key)] = json[key];
}
return result;
Object.keys(json) . reduce(function(result, key) {
result[fix_key(key)] = json[key];
return result;
}, {});
Object.assign(
{},
...Object.keys(json) .
map(key => ({[fix_key(key)]: json[key]}))
)
这使得一个小对象的数组每个都有一个键值对,使用ES6&#34;计算属性名称&#34;功能,然后使用ES6&#34;传播&#34;将它们传递给Object.assign
。运算符,将它们合并在一起。
答案 1 :(得分:4)
问题是您正在使用新密钥在原始对象中查找属性。使用keys[j]
代替key
:
var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
var key = keys[j].replace(/^element_/, "");
tmp[key] = json[keys[j]];
}
我在替换中使用正则表达式,以便^
可以匹配字符串的开头。这样它只会在字符串作为前缀时替换该字符串,并且不会将noexample_data
转换为no_data
。
注意:你拥有的不是“json”,它是一个JavaScript对象。 JSON是一种表示数据的文本格式。
这是因为我将键(对象)转换为字符串 (使用替换方法)?
没有。键是字符串,而不是对象。
您还可以通过删除旧对象并添加新对象来更改原始对象中的属性:
var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
if (keys[j].indexOf("element_") == 0) {
json[keys[j].substr(8)] = json[keys[j]];
delete json[keys[j]];
}
}
答案 2 :(得分:2)
key
不是原始json
,因为您已移除element_
前缀
var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
key = keys[j].replace("element_", "");
var _key = keys[j];
switch(key) {
default :
tmp[key] = json[_key];
break;
}
}
答案 3 :(得分:2)
试试这个:
var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
var key = keys[j]; // key
var value = json[key]; // data
delete json[key]; // deleting data with old key
key = key.replace("element_", ""); // renaming key
json[key] = value; // setting data with new key
}
答案 4 :(得分:0)
Object.fromEntries(
Object.entries(json).map(([k,v]) => [k.replace('element_', ''), v])
);