And*_*Mao 1 javascript iteration json traversal mongodb
我正在尝试在Mongo中索引各种JSON对象。有时,JSON对象在其中包含键的某处有一个键.,这使Mongo抱怨:
MongoError: The dotted field 'foo (e.g. bar)' in 'key.0.prop foo (e.g. bar)' is not valid for storage.
Run Code Online (Sandbox Code Playgroud)
抛开这些数据不应该具有这种键,我想暂时解决这个问题,方法是通过删除包含点的文本来调整其中带有点的键。但是,这些键可以在对象中的任何位置,这需要同时遍历和修改键。例如,
{
"foo": {
"foo (e.g. bar)": "baz"
},
"a": "b"
}
Run Code Online (Sandbox Code Playgroud)
会成为
{
"foo": {
"foo": "baz"
},
"a": "b"
}
Run Code Online (Sandbox Code Playgroud)
基于transform(badKey)我要指定的某些功能。
迭代Javascript对象并根据某些条件修改键的最简单/最可靠的方法是什么?请注意,某些键可能嵌套在多个级别的深处,因此无法在此处进行简单的键值迭代。指向提供此功能的库的指针非常棒。
不使用JSON.stringify这是一个过大的杀伤力
function deepTransformKeys(obj) {
if (obj && typeof obj === 'object') {
var allKeys = Object.keys(obj);
for(var i = 0 ; i < allKeys.length ; i++){
var k = allKeys[i];
var value = obj[k];
if (isBadKey(k)) {
var goodKey = transform(k);
obj[goodKey] = value;
delete obj[k];
}
if ( typeof value === 'object') {
deepTransformKeys(value);
}
}
}
return obj;
}
Run Code Online (Sandbox Code Playgroud)
您可以定义所需的键并希望对其进行转换:
var GoodKeyRegex = /^\w+$/
function isBadKey(key) {
return !GoodKeyRegex.test(key);
}
function transform(key) {
return key.replace(/\W+/g, "");
}
Run Code Online (Sandbox Code Playgroud)
简单的输入和输出
var x = {
"foo": {
"foo (e.g. bar)": {
"foo (e.g. bar)2": {
"foo (e.g. bar)3" : {
"foo1": "bar1"
}
}
}
},
"a": "b"
};
console.log('INPUT',JSON.stringify(x, null, ' '));
var y = deepTransformKeys(x);
console.log('---------------------------');
console.log('OUTPUT', JSON.stringify(y, null, ' '));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
849 次 |
| 最近记录: |