Javascript 有没有办法简化使用node.js有条件地向对象添加值的过程?
我有一个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
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,请尝试