2017-08-03 33 views
3

我搜索了很久迭代,但找不到我的问题的任何解决方案... 我得到一个随机嵌套的JSON对象是这样的:更换价值,同时通过嵌套JSON文件在JavaScript

var obj = { a: 1, b: 2, c: { a: 1, b: 2, c: {a: 'hello', b: 'HowAreYou?'} } }; 
someValue = 'hello'; 
newValue = 'bye'; 

现在我要搜索'someValue'。如果'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) 

这个作品真的很好,但我怎样才能改变“someValue中”到“NEWVALUE”,并再次返回整个JSON文件? 我见过很多例子如何处理这个问题,但是我需要一个任何类型的嵌套json对象的解决方案,而不知道改变这个值的路径。也许这是一个完全错误的方法... 在此先感谢!

+0

可能的复制[查找和更新在嵌套JSON对象(https://stackoverflow.com/questions/17988939/find-and-update-in-nested-json-object)。另一个可能有帮助的链接:https://stackoverflow.com/questions/15523514/find-by-key-deep-in-a-nested-object – Rajesh

回答

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

+1

你甚至可以优化它为'typeof value ==='object'&& JSON.stringify(value).indexOf(query)> = 0' – Rajesh

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

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) 

显然,这将发生变异的对象本身的价值,所以如果你想要一个全新的对象,你将不得不做有些不同。

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

+0

这是什么目的:'object [k] &&'? – Rajesh

+0

它防止'null'值被键迭代。 –

+0

我认为,我对@ Alexandru-Ionut Mihai的回答的评论不仅会解决您的用例,而且还会进行优化,因为不应该遍历没有密钥 – Rajesh

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) 
+0

*老兄,你只需要改变你的代码就像下面的代码它会为你工作。*这是一条评论线,将被标记为*太聊天*。答案应该有一个解释。 – Rajesh