Javascript Underline.js中的递归/深度扩展/赋值?
有没有办法获取underline.js函数: 将源对象中的所有特性复制到 目标对象,并返回目标对象。一切正常, 因此,最后一个源将覆盖中同名的属性 以前的论点 。。。递归地工作 实际上,Javascript Underline.js中的递归/深度扩展/赋值?,javascript,underscore.js,Javascript,Underscore.js,有没有办法获取underline.js函数: 将源对象中的所有特性复制到 目标对象,并返回目标对象。一切正常, 因此,最后一个源将覆盖中同名的属性 以前的论点 。。。递归地工作 实际上,creditOperation中的query属性将完全覆盖baseOperation中定义的query属性: var url=require('url')) ,uz=require('下划线'), ,基本操作={ 主持人:“gateway.skebby.it”, 路径名:“api/send/smseasy/adv
creditOperation
中的query
属性将完全覆盖baseOperation
中定义的query
属性:
var url=require('url'))
,uz=require('下划线'),
,基本操作={
主持人:“gateway.skebby.it”,
路径名:“api/send/smseasy/advanced/http.php”,
协议:“https”,
查询:{
“用户名”:“foo”,
“密码”:“栏”,
}
};
var creditOperation=u0.extend(baseOperation{
查询:{
“方法”:“baz”
}
});
console.log(url.format(creditOperation));
我想获得此信用操作
:
{
主持人:“gateway.skebby.it”,
路径名:“api/send/smseasy/advanced/http.php”,
协议:“https”,
查询:{
“用户名”:“foo”,
“密码”:“栏”,
“方法”:“baz”
}
}
没有,因为处理不同类型的对象太复杂了。相反,鼓励用户实施他们自己的解决方案,并支持他们所需要的
在您的情况下,它只是普通对象,因此实现非常简单:
_.deepObjectExtend = function(target, source) {
for (var prop in source)
if (prop in target)
_.deepObjectExtend(target[prop], source[prop]);
else
target[prop] = source[prop];
return target;
}
使用(下划线叉)可以。
Lodash的\uExtend方法接受第三个(或更高)参数作为函数,接收值(旧值和新值);所以你可以这样做:
var deep = function(a, b) {
return _.isObject(a) && _.isObject(b) ? _.extend(a, b, deep) : b;
};
var a = {a:{b:{c:1}}},
b = {a:{b:{z:1}}};
_.extend(a,b,deep);
upd.
如评论中所述,lodash中有相同的功能,称为:
jQuery有一个函数,它的作用与下划线对应项相同,但也有一个deep参数,允许它根据需要递归合并:
var creditOperation = $.extend(true, baseOperation, {
query: {
'method': 'baz'
}
});
或者,如果您不想覆盖baseOperation:
Bergi的deep extend的独立版本,包括修复值是字符串而不是对象的情况。还修补了更严格的要求
function deepObjectExtend (target, source) {
for (var prop in source) {
if (source.hasOwnProperty(prop)) {
if (target[prop] && typeof source[prop] === 'object') {
deepObjectExtend(target[prop], source[prop]);
}
else {
target[prop] = source[prop];
}
}
}
return target;
}
Kurt Milam发表了一篇文章。它甚至可以处理正则表达式(如果需要的话)。 文件摘录: 将其与下划线.js混合使用:
\ mixin({deepExtend:deepExtend})代码>
可以这样称呼它:var myObj=\u0.deepExtend(祖父母、孩子、孙子、曾孙)
注意:保持干燥
如果使用JSON配置文档,此函数尤其有用。它允许您创建默认值
使用最常用的设置配置文档,然后覆盖这些设置
特定案例的设置。它接受任意数量的对象作为对象
参数,为您提供对配置文档的细粒度控制
等级制度
下划线的extend()不进行深度扩展;事实上,下划线中没有可以深度扩展的函数
您可以使用lodash来实现这一点。这似乎会在命中非对象的属性时引发异常。在尝试递归之前,需要验证目标[prop]和源[prop]都是对象。第三行可能类似于if(target中的prop&&typeof(target[prop])=='object'&&typeof(source[prop])='object')
。是的,我希望这个extend
函数只扩展(expand?)对象,而不是覆盖其中的任何属性(描述中只说普通对象)。如果你想这样做,If(typeof target[prop]='object')
应该足够了。我不确定两个对象具有相同属性如何使它们不是普通对象。如果该函数处理具有相同属性的对象(并且更多地遵循uz.extend的精神),则该函数的实用性将提高约5倍。此外,如果源道具不是对象而目标道具是对象,那么仅检查目标[prop]是否是对象,仍然会(非常)产生意外的结果:不可否认,如果有这样的情况,您可能需要对该函数进行一些额外的考虑。@wizzard:当然,我的个人库中有更复杂的extend
功能变体,这里的这个并不是很通用。它只处理OP想要混合的(深度嵌套的)属性的问题的用例。下划线不会,但它的替代品有它,参见@Paolo_Moretti注释:。merge(target,source)
您还可以使用:递归地合并源对象自己的可枚举属性,不会解析为未定义到目标对象中。这不会回答question@wapsee,相反,我认为这是最有用的答案。你能在你的标题中添加“deep”和“assign”两个词吗?这样就可以很容易地通过谷歌找到帖子了。像“Recursive/deep extend/assign in Underline.js?”谢谢你的这一个,最好是使用而不是自己编写,不管怎样,在很多情况下,jquery是在project中使用的。这是很多人在找到这个页面时真正想要的:)第二个是百万美元的答案!!!我只能给你+1:)
var creditOperation = $.extend(true, {}, baseOperation, {
query: {
'method': 'baz'
}
});
function deepObjectExtend (target, source) {
for (var prop in source) {
if (source.hasOwnProperty(prop)) {
if (target[prop] && typeof source[prop] === 'object') {
deepObjectExtend(target[prop], source[prop]);
}
else {
target[prop] = source[prop];
}
}
}
return target;
}