【问题标题】:How to find and replace value in JSON?如何在 JSON 中查找和替换值?
【发布时间】:2019-06-27 17:48:08
【问题描述】:

我有一个这样的对象:

{
  "responses": {
    "firstKey": {
      "items": {
        "name": "test name one"
      }
    },
    "anotherKey": {
      "items": {
        "name": "test name two"
      }
    },
    "oneMoreKey": {
      "items": {
        "name": "John"
      }
    }
  }
}

我需要查找所有“名称”键并仅在以“测试名称”开头时替换其值,然后返回新的 JSON 对象:

{
  "responses": {
    "firstKey": {
      "items": {
        "name": "N/A"
      }
    },
    "anotherKey": {
      "items": {
        "name": "N/A"
      }
    },
    "oneMoreKey": {
      "items": {
        "name": "John"
      }
    }
  }
}

问题是通过对象的键不一致,即'firstKey','secondKey'......我试过ForEach但它似乎太麻烦......所以我需要lodash或vanila JavaScript来替换价值。

【问题讨论】:

  • 你有一个 JavaScript 对象。真的没有“JSON 对象”这样的东西。
  • forEach 是……太麻烦了?我的意思是,你只需要键然后迭代一个数组。我不清楚你遇到的具体问题是什么——如果你知道你想使用 lodash 那么为什么不直接使用它呢?您基本上是在要求某人编写代码吗?
  • 能否发布您尝试过的内容以及遇到的问题?
  • 我同意 Dave...代码讲义
  • 请告诉我如何使用 lodash 搜索以 'xxxxx.我自己写代码

标签: javascript node.js json lodash


【解决方案1】:

解析时也可以:

var json = `{
  "responses": {
    "firstKey": {
      "items": {
        "name": "test name one"
      }
    },
    "anotherKey": {
      "items": {
        "name": "test name two"
      }
    },
    "oneMoreKey": {
      "items": {
        "name": "John"
      }
    }
  }
}`

var obj = JSON.parse(json, (k, v) => k == 'name' && /^test name/.test(v) ? 'N/A' : v)

console.log( obj )

【讨论】:

    【解决方案2】:

    应该迭代javascript对象,然后可以检查和替换name的每个值。有诸如 hasOwnProperty() 之类的检查可用于确保您没有迭代缺少“项目”或“名称”的对象,以便更好地处理错误。

    var data = {
      "responses": {
        "firstKey": {
          "items": {
            "name": "test name one"
          }
        },
        "anotherKey": {
          "items": {
            "name": "test name two"
          }
        },
        "oneMoreKey": {
          "items": {
            "name": "John"
          }
        }
      }
    };
    

    鉴于上面的 JSON,您可以使用简单的 for 语句进行迭代,然后检查每个名称的某个值并进行替换。

    for(var key in data.responses){
        if ((data.responses[key].items.name).match(/test name/)){
           data.responses[key].items.name = "N/A";
        } 
    }
    

    要检查您的替换,您可以将data 登录到控制台。

    console.log(JSON.stringify(data));
    

    【讨论】:

      【解决方案3】:

      一个 javascript 对象在所有意图和目的上都是一棵——尽管它可以是并且很可能是一个有向图——很可能是cyclic 表示图中的一个节点指向它自己的父节点。跟随一个循环可能会导致永无止境的递归或循环。

      您想使用traverse 之类的东西来做您正在谈论的事情。它会处理所有让遍历图变得很麻烦的事情——处理图中的循环等等。

      const traverse = require('traverse');
      . . .
      var scrubbed = traverse(obj).map( function(value) {
        const isTestName = this.key === 'name'
          && value
          && /^test name/i.test(value)
          ;
      
        if (isTestName) {
          this.update('N/A');
        }
      
      });
      

      注意:travese 的回调函数不能是箭头函数(() => {...} 因为该函数的 this 上下文是当前正在检查的节点的 traverse 上下文.

      traverse 上下文还允许您访问从根到当前节点的整个路径,以及到父节点的 traverse 上下文的向上链接。

      【讨论】:

        【解决方案4】:

        做这样的事情。使用正则表达式转换为字符串替换(也将键添加到正则表达式),然后再转换回来。

        
        var data = {
          "responses": {
            "firstKey": {
              "items": {
                "name": "test name one"
              }
            },
            "anotherKey": {
              "items": {
                "name": "test name two"
              }
            },
            "oneMoreKey": {
              "items": {
                "name": "John"
              }
            }
          }
        };
        
        var originalMsg = JSON.stringify(data);
        console.log(data)
        console.log(originalMsg)
        var updatedMsg = originalMsg.replace(/test name [a-z]*/g, "N/A");
        console.log(updatedMsg)
        var newObj = JSON.parse(updatedMsg); 
        console.log(newObj);
        
        

        【讨论】:

        • 谢谢@PraveenB。我看到了首先对其进行字符串化的解决方案。只是认为可以通过 .find、.findindex 来完成 ..
        • 在这个小例子中当然可以这样做,但是应该这样做吗?您实际上并没有评估 SomeKey.items.name 的值并进行更新。这会更新 JSON 中任何位置的值或键
        • @DanielGale 我没有提供完整的解决方案,正如我在评论中提到的那样,它只是向正则表达式添加了密钥。不想提供完整的解决方案,让询问的人知道它是如何工作的
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-04
        • 1970-01-01
        • 1970-01-01
        • 2020-01-10
        • 1970-01-01
        • 2012-02-12
        • 2020-06-24
        相关资源
        最近更新 更多