递归地替换所有出现的具有- to - _字符的大型JSON键



我有一个json从谷歌页面速度api,这需要导出到大查询。由于BQ不支持带有- symbol的键,所以我必须将所有带有- char的键名替换为_

请注意,我不能在整个字符串上执行查找和替换,因为值需要一个- char。json结构可能很复杂,我理解唯一的方法就是迭代嵌套对象的所有键。

我发现了这个https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

但不能迭代嵌套json,因为我不能预先确定json结构和所有必须动态决定的任何指针如何替换所有字符将是伟大的

输入JSON在这里:https://drive.google.com/file/d/1lFYW26xsPGQp6WU9h6f2-E1bHW-hDIic/view?usp=sharing

const replaceKeys = obj => {
return Object.fromEntries(Object.entries(obj).map( ([key,value]) => {
return [
key.replace("-","_"),
Array.isArray(value)
? value.map(replaceKeys)
:typeof value == "object"
? replaceKeys(value)
: value
];
}))
}
const result = input.map(replaceKeys);
console.log(result);

你可以做这个转换,当你JSON.parse()数据从谷歌,或当你JSON.stringify()对象发送它到大查询。

国际海事组织。这是最经济的方法,转换解析或序列化,而不是先解析后转换或先转换后序列化。

// sources
const obj = {
"key-with-dashes": [{
"some-value": 42
}]
};
const json = JSON.stringify(obj);
// utilities
const includesDash = v => v.includes("-");
const replaceDashInKey = kv => {
kv[0] = kv[0].replace(/-/g, "_");
return kv;
}
const cleanupDashesInKeys = (k, v) => {
if (typeof v === "object" &&
v !== null &&
!Array.isArray(v) && 
Object.keys(v).some(includesDash)
) {
return Object.fromEntries(Object.entries(v).map(replaceDashInKey))
}
// this value has no keys with dashes
return v;
};
//cleanup keys
console.log("on parse", JSON.parse(json, cleanupDashesInKeys));
console.log("on stringify", JSON.stringify(obj, cleanupDashesInKeys));
.as-console-wrapper{top:0;max-height:100%!important}

最新更新