Javascript 从键数组在对象/数组中设置嵌套项

Javascript 从键数组在对象/数组中设置嵌套项,javascript,arrays,json,reactjs,object,Javascript,Arrays,Json,Reactjs,Object,我有一堆JSON,包含多个对象、数组、字符串、布尔值、数字等,它们存储在根级别和组件的一个对象中 以下是一个示例: { "theme": { "auto": { "sensor": "sensor.sn1_ldr", "below": 600 }, "ui": { "cards": { "round": false, "elevation": 1 } }, ... },

我有一堆JSON,包含多个对象、数组、字符串、布尔值、数字等,它们存储在根级别和组件的一个对象中

以下是一个示例:

{
  "theme": {
    "auto": {
      "sensor": "sensor.sn1_ldr",
      "below": 600
    },
    "ui": {
      "cards": {
        "round": false,
        "elevation": 1
      }
    },
    ...
  },
  ...
}
我已成功传回数组中项目的路径和新值,如下所示:

["theme", "auto", "sensor"]
如何从那里设置该路径的新值?即相当于:

config.theme.auto.sensor = newValue;
但是使用返回的路径数组

到目前为止,我的方法是:

handleConfigChange = (path, value) => {
  console.log(path, value);
  let config = this.state.config;
  // Set the new value

  this.setState({ config });
};

可以存储最后一个关键点,并通过从路径中获取关键点来减少对象

函数设置值(对象、路径、值){
var last=path.pop();
reduce((o,k)=>o[k]=o[k]| |{},object)[last]=value;
}
var config={theme:{auto:{sensor:{sensor.sn1_ldr],下:600},ui:{cards:{round:false,elevation:1}},
路径=[“主题”、“自动”、“传感器”];
setValue(配置,路径'foo');
console.log(config)
。作为控制台包装{最大高度:100%!重要;顶部:0;}
  • 使用Object.key获取密钥数组:
  • 使用递归循环

    const object1 = {
      "theme": {
        "auto": {
          "sensor": "sensor.sn1_ldr",
          "below": 600
        },
        "ui": {
          "cards": {
            "round": false,
            "elevation": 1
          }
        },
    
      },  
    }
    
    var result = [];
    see(object1);
    console.log(result);
    
    function see (obj){
        var k = Object.keys(obj)
        for (var i = 0; i < k.length; i++){
            result.push(k[i]);
            if (obj[k[i]] instanceof Object){
                see(obj[k[i]]);
            }
        }
    }
    
    const object1={
    “主题”:{
    “自动”:{
    “传感器”:“sensor.sn1_ldr”,
    “低于”:600
    },
    “用户界面”:{
    “卡片”:{
    “圆”:假,
    “标高”:1
    }
    },
    },  
    }
    var结果=[];
    见(1);
    控制台日志(结果);
    功能见(obj){
    var k=对象键(obj)
    对于(变量i=0;i

  • 下面是尼娜答案的简单版本(使用reduce)

    希望这能帮助你了解背后的情况

    const setValueByPathArray = (object, path, value) => {
      let i = 0
      let reference = object
      while (i < path.length - 1) {
        const currentPath = path[i]
        reference = reference[currentPath]
        i += 1
      }
      const lastPath = path[path.length - 1]
      reference[lastPath] = value
      return object
    }
    
    const config = { theme: { auto: { sensor: "sensor.sn1_ldr", below: 600 }, ui: { cards: { round: false, elevation: 1 } } } }
    const path = ["theme", "auto", "sensor"];
    
    setValueByPathArray(config, path, 'foo')
    
    const setValueByPathArray=(对象、路径、值)=>{
    设i=0
    让引用=对象
    而(i
    至少非常相关:接受答案中的函数首先将给定字符串转换为与您相同的数组。您应该大胆阅读数组中的元素数是否始终相同?谢谢!我得研究一下它到底是如何工作的,但它解决了我的问题