在javascript中迭代嵌套的json文件时替换值

时间:2017-08-03 09:46:34

标签: javascript jquery json recursion

我搜索了很长时间,但找不到解决问题的方法...... 我得到了一个随机嵌套的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对象,而不知道改变这个值的路径。也许这是一个完全错误的方法...... 提前致谢!

6 个答案:

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

您可以对对象使用递归调用。

<强>演示

&#13;
&#13;
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;
&#13;
&#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

的作者