如何在JSON中查找和替换值?

时间:2019-06-27 17:48:08

标签: javascript node.js json lodash

我有一个这样的对象:

{
  "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替换价值。

4 个答案:

答案 0 :(得分:1)

应该迭代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));

答案 1 :(得分:0)

它也可以在解析过程中完成:

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 :(得分:0)

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

您想使用类似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上下文是{{1} }当前节点的上下文。

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

答案 3 :(得分:-2)

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


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