Javascript 向对象添加一个值,该值的关键点深度基于数组

Javascript 向对象添加一个值,该值的关键点深度基于数组,javascript,reactjs,Javascript,Reactjs,我有一个数组。比如说: const array = ["lvl1", "lvl2", "lvl3", "key"] const value = false const object = { lvl1: { dogs: "bark", lvl2: { cats: "meow", lvl3: { cows: "moo" key: true } } } } 我有价值。比如说: const arra

我有一个数组。比如说:

const array = ["lvl1", "lvl2", "lvl3", "key"]
const value = false
const object = {
  lvl1: {
    dogs: "bark",
    lvl2: {
      cats: "meow",
      lvl3: {
        cows: "moo"
        key: true
      }
    }
  }
}
我有价值。比如说:

const array = ["lvl1", "lvl2", "lvl3", "key"]
const value = false
const object = {
  lvl1: {
    dogs: "bark",
    lvl2: {
      cats: "meow",
      lvl3: {
        cows: "moo"
        key: true
      }
    }
  }
}
我有一个目标。比如说:

const array = ["lvl1", "lvl2", "lvl3", "key"]
const value = false
const object = {
  lvl1: {
    dogs: "bark",
    lvl2: {
      cats: "meow",
      lvl3: {
        cows: "moo"
        key: true
      }
    }
  }
}
如何创建一个函数,该函数接受
数组
,然后更新对象,以便使用新的
值更新数组中的
键(数组中的最后一项)?它需要根据数组中的第一个
array.length-1
字符串进行适当嵌套

例如,我们调用函数
createObject
。如果我使用上面已经定义的
数组
调用它:

const newObject = createObject(array, value)
那么newObject应该等于:

{
  lvl1: {
    dogs: "bark",
    lvl2: {
      cats: "meow",
      lvl3: {
        cows: "moo"
        key: false
      }
    }
  }
}
{
  lvl1: {
    dogs: "bark",
    lvl2: {
      cats: "stink",
      lvl3: {
        cows: "moo"
        key: true
      }
    }
  }
}
下面是另一个具有不同嵌套级别的示例:

const updatedObject = createObject(["lvl1", "lvl2", "cats"], "stink")
则UpdateObject应等于:

{
  lvl1: {
    dogs: "bark",
    lvl2: {
      cats: "meow",
      lvl3: {
        cows: "moo"
        key: false
      }
    }
  }
}
{
  lvl1: {
    dogs: "bark",
    lvl2: {
      cats: "stink",
      lvl3: {
        cows: "moo"
        key: true
      }
    }
  }
}
我已经走了这么远,但它不起作用:

import object from "./object"

const createObject = (array, value) => {
  let results = object;
  for (let i = 0; i < array.length; i++) {
    i === array.length - 1
      ? (results = results[array[i]] = {
          ...results[array[i]],
          [array[i]]: value
        })
      : (results = results[array[i]] = {
          ...results[array[i]],
          [results[array[i]]]: {}
        });
    }
  return results;
}
从“/object”导入对象
常量createObject=(数组,值)=>{
让结果=对象;
for(设i=0;i

我不想更改初始对象。我想返回一个新对象。我不会向对象添加任何新的键/值对,只会更改现有的键/值对。

这是一种更通用的方法,因为它不假设源是名为
object
的全局变量:

let数组=[“lvl1”、“lvl2”、“lvl3”、“key”];
设值=假;
让createObject=(键,值)=>{
设o,obj=o={};
让lastKey=keys.pop();
forEach(key=>o=o[key]=o[key]|{});
o[lastKey]=值;
返回obj;
};
让addToObject=(对象、键、值)=>{
让o,copy=o=JSON.parse(JSON.stringify(obj));
让lastKey=keys.pop();
forEach(key=>o=o[key]=o[key]|{});
o[lastKey]=值;
返回副本;
};
设x=createObject(数组,值);
设y=addToObject(x,['lvl1'],3);
设z=addToObject(y,['a','b','c'],4);
控制台日志(x);
控制台日志(y);

控制台日志(z)您可以获取条目并构建新对象,检查实际键是否等于数组的第一项,然后检查其余数组的长度并获取值。对于嵌套副本,检查对象并通过再次调用函数来构建新的更深层次

函数getObject(对象,[键,…键],值){ 返回Object.assign({},…)对象 .条目(对象) .map(([k,v])=>({[k]:k==key&&!keys.length 价值 :v&&typeof v===“对象” ?getObject(v,k==键?键:[],值) :v })), Object.keys(Object).包括(key)|{[key]:keys.length ?getObject({},键,值) :价值 } ); } 常数 object1={lvl1:{狗:“吠叫”,lvl2:{猫:“喵喵”,l3:{牛:“哞”,键:真}}, object2=getObject(object1,[“lvl1”、“lvl2”、“lvl3”、“key”],false), object3=getObject(object2,[“lvl1”、“lvl2”、“猫”]、“臭”), object4=getObject({},[“lvl1”、“lvl2”、“cats”]、“臭味”);; console.log(object1); console.log(object2); console.log(object3); console.log(object4)
作为控制台包装{max height:100%!important;top:0;}
是否要获取新的独立对象?是的,我不想更改现有对象。现有对象实际上是我的React应用程序中的状态,因此我不想直接更改它。运行上面的代码段和你的代码笔代码段,我看到了预期的结果(与你的评论中的结果相同)。你说得对,被剪断的代码笔切断了浏览器控制台中的控制台。如果我检查Chrome上的控制台,它就在那里。谢谢我会将此标记为正确答案,并用我用来获得确切要求的最终代码更新我的帖子。尽管我注意到的一个问题是
o
addToObject
中未定义。我在chrome中没有发现这个错误,但你是对的,
让a=b=0
声明
a
而不是
b
。更新我的答案以明确声明
o