Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与JavaScript中的默认对象相交的对象_Javascript_Node.js_Object - Fatal编程技术网

与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。