Javascript:深入遍历/迭代对象键

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对象并根据某些条件修改键的最简单/最可靠的方法是什么?请注意,某些键可能嵌套在多个级别的深处,因此无法在此处进行简单的键值迭代。指向提供此功能的库的指针非常棒。

bha*_*tol 5

不使用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)