Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.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 有没有办法简化使用node.js有条件地向对象添加值的过程?_Javascript_Node.js_Dry - Fatal编程技术网

Javascript 有没有办法简化使用node.js有条件地向对象添加值的过程?

Javascript 有没有办法简化使用node.js有条件地向对象添加值的过程?,javascript,node.js,dry,Javascript,Node.js,Dry,我有一个node.js脚本,如果存在局部值或全局值,我将向对象添加键。我觉得应该有一个很好的方法来简化这个,但我没有看到。有没有办法让这段代码不那么冗长: var object = { defaultKey: defaultValue }; // Add some conditional keys based on local and global settings // With local settings taking precedence if (local

我有一个node.js脚本,如果存在局部值或全局值,我将向对象添加键。我觉得应该有一个很好的方法来简化这个,但我没有看到。有没有办法让这段代码不那么冗长:

  var object = {
    defaultKey: defaultValue
  };

  // Add some conditional keys based on local and global settings
  // With local settings taking precedence
  if (local.firstSetting || firstSetting) {
    entry.firstSetting = local.firstSetting || firstSetting;
  }
  if (local.secondSetting || secondSetting) {
    entry.secondSetting = local.secondSetting || secondSetting;
  }
  if (local.thirdSetting || thirdSetting) {
    entry.thirdSetting = local.thirdSetting || thirdSetting;
  }

我曾考虑过将所有键添加到对象中,然后只为它们指定一个值
local.thirdset | | thirdset
,但我认为可能会有一个未定义值的键并不明智。

修改Jaromanda X的anwer:

var t;
if( t = local.firstSetting  || firstSetting  )  entry.firstSetting  = t;
if( t = local.secondSetting || secondSetting )  entry.secondSetting = t;
if( t = local.thirdSetting  || thirdSetting  )  entry.thirdSetting  = t;

这里有一个共享的功能,可以重构成一个函数

function getSetting(name) {
    var setting = local[name] || globals[name] || entry[name];
    if(setting) {
        entry[name] = setting;
    }
}

getSetting('firstSetting');
getSetting('secondSetting');
getSetting('thirdSetting');

您可以使用类似的模块

它允许您使用任意数量的对象,这些对象将合并为一个对象。考虑到最右边的对象优先于所有其他对象。


这需要将全局变量分组到单个对象中,这可能是个好主意。

我现在要做的是:

  var pick = require('lodash.pick');
  var identity = require('lodash.identity');

  var object = pick({
    defaultKey: defaultValue
    firstSetting: local.firstSetting || firstSetting,
    secondSetting: local.secondSetting || secondSetting,
    thirdSetting: local.thirdSetting || thirdSetting
  }, identity);

这将过滤对象中所有未定义的值(或精确地说是伪值)。

@jfriend00这是不正确的。在节点中尝试此操作:
(function(){console.log(this);})(
)。您将看到,
引用了包含所有全局对象的全局对象。如果要在node.js中引用全局对象,请使用
全局对象。使用
this
隐式访问globals是非常糟糕的做法,因为它在各种情况下都会中断,比如在方法调用中,或者在使用严格模式的任何函数调用中,等等。。。如果你想访问globals,那么就使用
globals
对象。我没有考虑过这一点。我做了相应的编辑。谢谢@jfriend00。现在,所有这些问题都解决了,你怎么知道
firstSetting
实际上是一个全局问题呢?我在OP的代码中看不到这一点。它是父作用域中的变量,但不清楚它是否只是模块变量(不是全局变量)、父作用域中的变量、当前作用域中的变量还是什么。除非它是某个对象的属性,否则您必须传入它,而不是像现在这样访问它。代码中不清楚这一点,但问题表明它可以是“如果存在局部值或全局值。”大概是说
local
指的是
local
对象。但是你是对的,它们是否意味着在
globals
对象上还不清楚@先生,你能澄清一下吗?是的,我在考虑使用一个模块。Lodash可能也有一些功能,但它似乎没有在跳过未定义值的同时合并对象的方法。如果仍然使用Lodash,请尝试