Javascript 从键数组在对象/数组中设置嵌套项
我有一堆JSON,包含多个对象、数组、字符串、布尔值、数字等,它们存储在根级别和组件的一个对象中 以下是一个示例: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 } }, ... },
{
"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
至少非常相关:接受答案中的函数首先将给定字符串转换为与您相同的数组。您应该大胆阅读数组中的元素数是否始终相同?谢谢!我得研究一下它到底是如何工作的,但它解决了我的问题