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
。