gpt4 book ai didi

javascript - 将值添加到具有基于数组的键深度的对象

转载 作者:行者123 更新时间:2023-11-30 14:03:05 25 4
gpt4 key购买 nike

我有一个数组。假设它是:

const array = ["lvl1", "lvl2", "lvl3", "key"]

我有一个值(value)。假设它是:

const value = false

我有一个对象。假设它是:

const object = {
lvl1: {
dogs: "bark",
lvl2: {
cats: "meow",
lvl3: {
cows: "moo"
key: true
}
}
}
}

我如何创建一个接受arrayvalue 的函数,然后更新对象以便数组中的key (数组中的最后一项)更新为新的 value?它需要根据数组中的第一个 array.length - 1 字符串进行适当嵌套。

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

const newObject = createObject(array, value)

那么 newObject 应该等于:

{
lvl1: {
dogs: "bark",
lvl2: {
cats: "meow",
lvl3: {
cows: "moo"
key: false
}
}
}
}

这是另一个具有不同嵌套级别的示例:

const updatedObject = createObject(["lvl1", "lvl2", "cats"], "stink")

那么 updatedObject 应该等于:

{
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 的全局变量:

let array = ["lvl1", "lvl2", "lvl3", "key"];
let value = false;

let createObject = (keys, value) => {
let o, obj = o = {};
let lastKey = keys.pop();
keys.forEach(key => o = o[key] = o[key] || {});
o[lastKey] = value;
return obj;
};

let addToObject = (obj, keys, value) => {
let o, copy = o = JSON.parse(JSON.stringify(obj));
let lastKey = keys.pop();
keys.forEach(key => o = o[key] = o[key] || {});
o[lastKey] = value;
return copy;
};

let x = createObject(array, value);
let y = addToObject(x, ['lvl1'], 3);
let z = addToObject(y, ['a', 'b', 'c'], 4);

console.log(x);
console.log(y);
console.log(z);

关于javascript - 将值添加到具有基于数组的键深度的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55955471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com