在嵌套对象中查找键并替换其值 - Javascript

时间:2018-06-11 10:49:31

标签: javascript arrays json

这是我的小提琴:DEMO

通过递归迭代,我能够在object2 object3中找到键,并用data2 data3对象中的值替换它的值。

但是,如果它是一个数组,我无法替换它。 (在这种情况下称为'坐标') 怎么能修好?

function update(object, data) {
  function getAllKeys(o) {
    Object.keys(o).forEach(function(k) {
      if (typeof o[k] === 'object') {
        return getAllKeys(o[k]);
      }
      keys[k] = o;
    });
  }
  var keys = Object.create(null);
  getAllKeys(object);
  Object.keys(data).forEach(function(k) {
    if (keys[k] && k in keys[k]) { // check if key for update exist
      keys[k][k] = data[k];
    }
  });
}

3 个答案:

答案 0 :(得分:1)

使用以下命令更新getAllKeys方法:

  function getAllKeys(o) {
    Object.keys(o).forEach(function(k) {
      contains_object = Array.isArray(o[k]) && o[k].some(val=> { return typeof val == "object" && !Array.isArray(val);  });
      if ((Array.isArray(o[k]) && !contains_object)  || typeof o[k] !== 'object') {
        keys[k] = o;
      } else {
        return getAllKeys(o[k]);
      }
      keys[k] = o;
    });
  }

注意:!(o[k] instanceof Array) - http://jsfiddle.net/08pnu7rx/1/

答案 1 :(得分:0)

问题是typeof还会为数组返回object

当对象是数组时,您希望将函数更改为仍然指定键。

function getAllKeys(o) {
  Object.keys(o).forEach(function(k) {
    if (Array.isArray(o[k]) || typeof o[k] !== 'object') {
      keys[k] = o;
    } else {
      return getAllKeys(o[k]);
    }
  });
}

注意我交换了逻辑,因此您首先检查数组或其他非对象类型。如果该检查通过,则指定该值。如果没有,你递减。

您应该注意,这根本不是特定于数组的。例如,如果您具有Date的嵌套属性,则会遇到类似的问题。

答案 2 :(得分:0)

你的代码中的问题是typeof o[k] === 'object'返回true,即使o [k]是一个数组就是协调的情况,你需要对数组进行否定检查

Object.keys(o).forEach(function(k) {
  if (typeof o[k] === 'object'&& !Array.isArray(o[k])) {
    return getAllKeys(o[k]);
  }
  keys[k] = o;
});

<强> Working fiddle

根据docs or typeof

// use Array.isArray or Object.prototype.toString.call
// to differentiate regular objects from arrays
typeof [1, 2, 4] === 'object';