我如何在React JS中一次更新嵌套对象中所有键的值?

时间:2019-05-21 07:37:33

标签: javascript reactjs

我有以下对象,在以下对象中,我将首选项保存为true / false 现在,我想一次更新所有状态,例如全部选中或全部未选中的情况下为是/否。

obj = {
    a:false,
    b:{
        c:{
            e:{
                f:false,
                g:true,
            },
            h:{
                i:false,
                j:true,
            }
        }
    },
    k:{
        l:false,
        m:false
    },
    n:true
}

我正在考虑使用递归函数,并且可以使用递归函数访问所有键的值 但是我需要最好的方法来更新状态。

3 个答案:

答案 0 :(得分:2)

对于非常深的Array,直接方法可能会变慢, 我想到了一种使用字符串替换的方法。

orderby

无法告诉您它的性能如何,但是我认为无论数组有多深,复杂性都将保持不变。

答案 1 :(得分:1)

递归函数确实可以满足您的需求,它看起来像这样:

const obj = {
    a:false,
    b:{
        c:{
            e:{
                f:false,
                g:true,
            },
            h:{
                i:false,
                j:true,
            }
        }
    },
    k:{
        l:false,
        m:false
    },
    n:true
};

const setAllTo = (val, object) => Object.keys(object)
  .reduce((prev, curr) => ({
    ...prev,
    [curr]: typeof object[curr] === 'object' ?
      setAllTo(val, object[curr]) : val
  }), {})
  

const result = setAllTo(true, obj);

console.dir(result)

答案 2 :(得分:0)

不确定是否会卡住,但这应该可以做到:

function setState(obj, value) {
    for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      if (typeof obj[prop] === 'object') {
        setState(obj[prop], value);
      } else {
        obj[prop] = value;
      }
    }
  }
}

setState(obj, true);

setState函数的第二个参数设置每个属性的值。 您可以使用循环来做到这一点,但我认为递归示例更为优雅。

您需要的是逐步解决此问题:

  1. 首先,您传递整个对象
  2. 然后遍历该对象的每个属性
  3. 如果对象的属性也是对象,则您传递该特定对象 属性再次设置为setState函数,现在该函数可以使用 甚至更小的物体

如果属性不是对象,则在else语句中我们假定它包含布尔值,因此我们只需为其分配真值即可。因此,该函数将一直运行到到达包含布尔值的所有属性为止。