Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.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 Underline.js中的递归/深度扩展/赋值?_Javascript_Underscore.js - Fatal编程技术网

Javascript 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

有没有办法获取underline.js函数:

将源对象中的所有特性复制到 目标对象,并返回目标对象。一切正常, 因此,最后一个源将覆盖中同名的属性 以前的论点

。。。递归地工作

实际上,
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;
}