Javascript:深度遍历/遍历对象键

时间:2018-02-05 22:40:27

标签: javascript json mongodb iteration traversal

我试图在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.

暂且不说这些数据不应该有这种键,我想暂时通过删除包含点的文本来调整带有点的键来处理问题。但是,这些键可以位于对象中的任何位置,这需要同时进行遍历和键修改。例如,

{
  "foo": {
    "foo (e.g. bar)": "baz" 
  },
  "a": "b"
}

会变成

{
  "foo": {
    "foo": "baz" 
  },
  "a": "b"
}

基于我将指定的某个函数transform(badKey)

什么是最简单/最强大的方法来迭代Javascript对象并根据某些标准修改密钥?请注意,某些键可能嵌套在几个级别深处,因此直接键值迭代在此处不起作用。指向提供此功能的库的指针非常棒。

2 个答案:

答案 0 :(得分:3)

不使用JSON.stringify,这是一种矫枉过正的

<TextBox Text="{Binding ElementName=ViewSwap, Path=?????, Mode=OneWay}" />

您可以定义您想要转换它们的键的方式:

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;
}

简单的输入和输出

var GoodKeyRegex = /^\w+$/
function isBadKey(key) {
    return !GoodKeyRegex.test(key);
}

function transform(key) {
    return key.replace(/\W+/g, "");
}

答案 1 :(得分:1)

虽然我更喜欢Paticks的解决方案,但这是我对使用递归的看法。我仍然认为最有效和最有效的方法是使用词法分析器和解析器并忽略语言本身。

var json = {
  "foo": {
    "foo (e.g. bar)": "baz" 
  },
  "a": "b"
}

console.log(json)

function replace (obj) {
  for ( var key in obj ) {
    
    if (!obj.hasOwnProperty(key)) {continue;}
    
    if ( typeof obj[key] === 'object' && obj[key] !== null ) {
      replace(obj[key])
      }
    if (key.indexOf('.')> -1) {
      var new_key = key.replace(/\./g,' ')
      obj[new_key] = obj[key];
      delete obj[key];
    }
  }
}

replace(json)

console.log(json)