我搜索了很长时间,但找不到解决问题的方法...... 我得到了一个随机嵌套的json对象:
var obj = { a: 1, b: 2, c: { a: 1, b: 2, c: {a: 'hello', b: 'HowAreYou?'} } };
someValue = 'hello';
newValue = 'bye';
现在我要搜索“某些价值”。如果' obj'包含此值将触发警报。这是我的榜样:
function wannaChangeValue(obj) {
var itemKey;
if (obj instanceof Object) {
for (itemKey in obj) {
if (obj.hasOwnProperty(itemKey)) {
wannaChangeValue(obj[itemKey]);
}
}
} else {
alert(obj);
if (obj == someValue) {
alert('got it! now change...')
//change someValue to newValue
}
}
return obj
}
wannaChangeValue(obj)
这很好用,但我怎么能改变某些价值呢?到了'newValue'并再次返回整个json文件? 我已经看到很多例子如何处理这个问题,但是我需要一个解决方案来解决任何类型的嵌套json对象,而不知道改变这个值的路径。也许这是一个完全错误的方法...... 提前致谢!
答案 0 :(得分:3)
您可以对任何找到的对象使用递归方法,再次调用该函数。
function update(object, search, replace) {
Object.keys(object).forEach(function (k) {
if (object[k] && typeof object[k] === 'object') {
return update(object[k], search, replace)
}
if (object[k] === search) {
object[k] = replace;
}
});
}
var object = { a: 1, b: 2, c: { a: 1, b: 2, c: {a: 'hello', b: 'HowAreYou?'} } };
update(object, 'hello', 'bye');
console.log(object)

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)
您可以使用for...in
循环创建函数,如果当前值与oldValue匹配,则更改该值。
var obj = { a: 1, b: 2, c: { a: '1', b: 2, c: {a: 'hello', b: 'HowAreYou?'} } };
var someValue = 'hello';
var newValue = 'bye';
function changeVal(data, oldV, newV) {
for(var i in data) {
if(typeof data[i] == 'object') changeVal(data[i], oldV, newV);
if(data[i] == oldV) data[i] = newV
}
return data
}
console.log(changeVal(obj, someValue, newValue))
答案 2 :(得分:0)
您可以定义一个功能,通过对象 以递归方式搜索value
,然后替换此值。
function replaceObj (obj, valueForSearch,valueForReplace) {
for (var key in obj) {
var value = obj[key];
if (typeof value === 'object') {
replaceObj(value, valueForSearch,valueForReplace);
}
if (value === valueForSearch) {
obj[key]=valueForReplace;
}
}
}
let obj = { a: 1, b: 2, c: { a: 1, b: 2, c: {a: 'hello', b: 'HowAreYou?'} } };
let someValue = 'hello';
let newValue = 'bye';
replaceObj(obj,someValue,newValue);
console.log(obj);

答案 3 :(得分:0)
这是一个快速的解决方案:
function wannaChangeValue(obj) {
var itemKey;
if (obj instanceof Object) {
for (itemKey in obj) {
if (obj.hasOwnProperty(itemKey)) {
obj[itemKey] = wannaChangeValue(obj[itemKey]);
}
}
} else {
alert(obj);
if (obj == someValue) {
alert('got it! now change...')
//change someValue to newValue
obj = someValue;
}
}
return obj
}
wannaChangeValue(obj)
显然这会改变对象本身的值,所以如果你想要一个全新的对象,你将不得不做一些不同的事情。
答案 4 :(得分:0)
您可以对对象使用递归调用。
<强>演示强>
var object = { a: 1, b: 2, c: { a: '1', b: 2, c: {a: 'hello', b: 'HowAreYou?'} } },
someValue = 'hello',
newValue = 'bye';
function wannaChangeValue(obj) {
var itemKey;
if (obj instanceof Object) {
for (itemKey in obj) {
if (obj.hasOwnProperty(itemKey)) {
if (!(obj[itemKey] instanceof Object) && obj[itemKey] == someValue) {
//alert(someValue + ' got it! now change...')
//change someValue to newValue
obj[itemKey] = newValue;
break;
} else {
wannaChangeValue(obj[itemKey]);
}
}
}
}
}
wannaChangeValue(object);
console.log(object)
&#13;
.as-console-wrapper {max-height: 100% !important;top: 0;}
&#13;
答案 5 :(得分:0)
这是使用 object-scan
的解决方案// const objectScan = require('object-scan');
const obj = { a: 1, b: 2, c: { a: 1, b: 2, c: { a: 'hello', b: 'HowAreYou?' } } };
const replace = (input, oldValue, newValue) => objectScan(['**'], {
abort: true,
rtn: 'bool',
filterFn: ({ value, parent, property }) => {
if (value === oldValue) {
parent[property] = newValue;
return true;
}
return false;
}
})(input);
console.log(replace(obj, 'hello', 'bye')); // returns true iff replace happened
// => true
console.log(obj);
// => { a: 1, b: 2, c: { a: 1, b: 2, c: { a: 'bye', b: 'HowAreYou?' } } }
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@13.7.1"></script>
免责声明:我是object-scan
的作者