与JavaScript中的默认对象相交的对象
我有一个带有对象的对象,基本上是每个公会的设置。在这些对象中有各种各样的配置选项,他们工会的管理员可以更改这些选项与JavaScript中的默认对象相交的对象,javascript,node.js,object,Javascript,Node.js,Object,我有一个带有对象的对象,基本上是每个公会的设置。在这些对象中有各种各样的配置选项,他们工会的管理员可以更改这些选项 { "1": { "foo": "Hello World", "bar": "Ello World", "roo": { "doo": "oof" } }, "2": { "foo": "foo bar foo bar", "bar": "World! Hi!", "roo": { "doo
{
"1": {
"foo": "Hello World",
"bar": "Ello World",
"roo": {
"doo": "oof"
}
},
"2": {
"foo": "foo bar foo bar",
"bar": "World! Hi!",
"roo": {
"doo": "boo!"
}
}
}
对于这些设置,我有一个默认对象
const默认值={
福:“你好,世界!”,
酒吧:“Foo示例”,
roo:{
嘟嘟:“嘘”
}
};
当我向默认对象添加一个新的关键点时,我希望设置中的所有对象都适应这些新的更改,并且只添加具有默认值的新关键点。尽管如此,我不知道哪个键是新的,因为只有在启动时我才希望脚本检查新值并将其添加到现有设置中
此外,设置可以有嵌套对象,但不能有数组-数组仅用作值。我已经看过了,但我似乎不知道如何添加嵌套对象支持
例如,我可以向默认对象添加一个“foobarexample”
键,并将其作为默认值添加到所有设置中。我还应该能够将它添加到'roo'对象中,并且它仍然会更新,即使'roo'不是新的
如果您有任何建议,我们将不胜感激!谢谢这是JavaScript原型继承的完美用例:
const defaultObj={
福:“你好,世界!”,
酒吧:“Foo示例”,
roo:{
嘟嘟:“嘘”
}
};
const obj=Object.assign(Object.create(defaultObj),{foo:“New foo”});
const anotherObj=Object.create(defaultObj);
console.log('obj.foo',obj.foo);
console.log('anotherObj.foo',anotherObj.foo);
控制台日志('obj.bar',obj.bar);
defaultObj.bar=“新条”;
控制台日志('obj.bar',obj.bar);
console.log('anotherObj.bar',anotherObj.bar);
defaultObj.foobarexample=“ello”;
log('obj.foobarexample',obj.foobarexample);
log('anotherObj.foobarexample',anotherObj.foobarexample)代码>这是JavaScript原型继承的完美用例:
const defaultObj={
福:“你好,世界!”,
酒吧:“Foo示例”,
roo:{
嘟嘟:“嘘”
}
};
const obj=Object.assign(Object.create(defaultObj),{foo:“New foo”});
const anotherObj=Object.create(defaultObj);
console.log('obj.foo',obj.foo);
console.log('anotherObj.foo',anotherObj.foo);
控制台日志('obj.bar',obj.bar);
defaultObj.bar=“新条”;
控制台日志('obj.bar',obj.bar);
console.log('anotherObj.bar',anotherObj.bar);
defaultObj.foobarexample=“ello”;
log('obj.foobarexample',obj.foobarexample);
log('anotherObj.foobarexample',anotherObj.foobarexample)代码>
这个应该适合你要找的东西
const defaultValues = {
"1" : {
foo: 'Hello, World!',
bar: 'Foo example',
roo: {
doo: 'boo',
newest: {
goal: "dodo"
}
},
hello: "world"
}
};
function eachRecursive(obj, defaultValues, level = 0){
// check each key amongst the defaults
for (var k in defaultValues){
// if our original object does not have key attach it + default values associated
if (!obj.hasOwnProperty(k)) {
obj[k] = checkWith[k]
}
// keep calling as long as value is object
if (typeof obj[k] == "object" && obj[k] !== null)
eachRecursive(obj[k], checkWith[k], level + 1);
}
}
}
// for each of the specific entries check
for (let [key, value] of Object.entries(data)) {
eachRecursive(data[key], defaultValues["1"])
}
console.log(data["1"])
这个应该适合你要找的东西
const defaultValues = {
"1" : {
foo: 'Hello, World!',
bar: 'Foo example',
roo: {
doo: 'boo',
newest: {
goal: "dodo"
}
},
hello: "world"
}
};
function eachRecursive(obj, defaultValues, level = 0){
// check each key amongst the defaults
for (var k in defaultValues){
// if our original object does not have key attach it + default values associated
if (!obj.hasOwnProperty(k)) {
obj[k] = checkWith[k]
}
// keep calling as long as value is object
if (typeof obj[k] == "object" && obj[k] !== null)
eachRecursive(obj[k], checkWith[k], level + 1);
}
}
}
// for each of the specific entries check
for (let [key, value] of Object.entries(data)) {
eachRecursive(data[key], defaultValues["1"])
}
console.log(data["1"])
“这是原型继承的完美用例”-是的。但是为什么要使用newdefault()
构造函数呢?只需选择对象。创建。感谢您的解决方案!我理解您是如何做到的,它工作得非常完美:““这是原型继承的完美用例”-是的。但是为什么要使用newdefault()
构造函数呢?只需选择对象。创建。感谢您的解决方案!我理解你是如何做到的,它工作得非常完美:]鼓励回答中的链接用于背景和澄清,但即使链接停止工作,答案也应该回答问题。有一些语法错误,checkWith
未定义,但我成功了,但是roo
的内容没有更新,而且hello
没有定义,但这可能是因为我刚刚初始化了let checkWith={}函数头中的代码>。您可以更新您的答案吗?根据您链接的域/URL与您的用户名相同或包含您的用户名,您似乎已链接到您自己的站点/您所属的站点。如果你这样做了,你必须在你的帖子中披露这是你的网站。如果你不透露隶属关系,这被认为是垃圾邮件。请看:和。披露必须明确,但不需要正式。当它是你自己的个人内容时,它可以是类似“在我的网站上…”、“在我的博客上…”等。要么答案不完整,因为缺少变量,要么你根本没有测试它/忘记包含一些内容,@Henri De Bel。鼓励在答案中链接以了解背景和说明,但是,即使链接停止工作,答案也应该能回答这个问题。有一些语法错误,checkWith
没有定义,但是我让它工作了,但是roo
的内容没有更新,hello
没有定义,但这可能是因为我刚刚初始化了let checkWith={}函数头中的代码>。您可以更新您的答案吗?根据您链接的域/URL与您的用户名相同或包含您的用户名,您似乎已链接到您自己的站点/您所属的站点。如果你这样做了,你必须在你的帖子中披露这是你的网站。如果你不透露隶属关系,这被认为是垃圾邮件。请看:和。披露必须明确,但不需要正式。当它是你自己的个人内容时,它可能只是像“在我的网站上…”,“在我的博客上…”等。要么答案不完整,因为缺少变量,要么你根本没有测试它/忘记包含一些东西,@Henri De Bel。