Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
我如何合并2个javascript对象,如果它们不';不存在于另一个世界?_Javascript_Arrays_Merge - Fatal编程技术网

我如何合并2个javascript对象,如果它们不';不存在于另一个世界?

我如何合并2个javascript对象,如果它们不';不存在于另一个世界?,javascript,arrays,merge,Javascript,Arrays,Merge,如果我有如下定义的javascript对象/关联数组: function somefunction(options) { var defaults = { prop1: 'foo', prop2: 'bar' }; //Do stuff here } var a = { 'foo': 'bar', 'baz': 'bat' }; var b = { 'foo': 'quux' }; for (var prop in a) {

如果我有如下定义的javascript对象/关联数组:

function somefunction(options) {

    var defaults = {
        prop1: 'foo',
        prop2: 'bar'
    };

    //Do stuff here

}
var a = { 'foo': 'bar', 'baz': 'bat' };
var b = { 'foo': 'quux' };
for (var prop in a) {
    if (prop in b) { continue; }
    b[prop] = a[prop];
}
我想用它作为函数的默认值。因此,当调用函数时,我想用
默认值中的值填充
选项
变量,但前提是
选项
中不存在这些值

所以我们可以说这就是所谓的

somefunction({ prop1: 'fish' });
我怎样才能使
选项
默认值
合并,从而得到这个结果

{
    prop1: 'fish',
    prop2: 'bar'
}

在重新阅读了这个问题后,我意识到你可能在寻找更像这样的东西:

function somefunction(options) {

    var defaults = {
        prop1: 'foo',
        prop2: 'bar'
    };

    //Do stuff here

}
var a = { 'foo': 'bar', 'baz': 'bat' };
var b = { 'foo': 'quux' };
for (var prop in a) {
    if (prop in b) { continue; }
    b[prop] = a[prop];
}

您可以查看jQuery或原型功能

看起来是这样的:(直接取自jQuery)

jQuery.extend=jQuery.fn.extend=function(){
//将引用复制到目标对象
var target=arguments[0]|{},i=1,length=arguments.length,deep=false,options;
//处理深度复制情况
如果(目标类型==“布尔”){
深度=目标;
target=参数[1]|{};
//跳过布尔值和目标值
i=2;
}
//当目标是字符串或其他内容时处理大小写(可能在深度复制中)
if(typeof target!=“object”&&&!jQuery.isFunction(target))
目标={};
//如果只传递一个参数,则扩展jQuery本身
如果(长度==i){
目标=这个;
--一,;
}
对于(;i

测试
//该方法比其演示更简单:
功能合并(obj1、obj2、强制){
用于(obj2中的var p){
如果(力| | obj1[p]==未定义)obj1[p]=obj2[p];
}
返回obj1;
}
//演示:
var merge_demo=函数(){
//为演示设置一个to string方法
var restring=函数(){
var s=[];
for(本文件中的var p){
s[s.length]=p+':'+这个[p];
}
返回'{'+s.join(',')+'}';
}
//定义两个对象
var O1={
a:1,b:2,c:3
}
氧分压={
a:10,b:11,d:4
}
//开始演示,将对象内容写入字符串:
var str='Object1='+restring.call(O1)+'\nObject2='+restring.call(O2)+'\n\n';
//合并两个对象而不覆盖值:
合并(O1,O2);
//更新字符串中的对象内容:
str+='merge(Object1,Object2)='+restring.call(O1)+'\n\n';
//合并和替换现有值:
合并(O1,O2,真);
//更新和返回字符串:
str+='merge(Object1,Object2,true)='+restring.call(O1);
返回str;
}
警报(merge_demo());

我是PrototypeJS的顽固分子。与jQuery相比,美国Java类型更喜欢PrototypeJS的OO设计。以下是如何将两个对象/哈希/映射与Proto合并:

$H(obj1).merge(obj2).toObject()

输入obj1和obj2不受影响。obj2映射项具有优先权(即obj1和obj2都具有相同的键,obj2中该键的值将被覆盖)。

使用Google闭包库可以这样做:

goog.require('goog.object');
function somefunction(options) {
  var defaults = {
    prop1: 'foo',
    prop2: 'bar'
  };
  goog.object.extend(defaults, options);
  // if the property is defined in options it will overwrite value.
}

似乎要执行一些深度复制魔术需要做大量的工作-真的有必要吗?这是一个好问题,深度复制的东西可能会被滥用。这不是你需要编写的代码,这就是扩展函数的样子,我所要做的就是选项=$.extend(默认值,选项)我意识到他共享了一个jQuery方法——但执行“深度复制”需要进行大量处理,而OP使它看起来更简单。只是要记住一点。我想覆盖Flot选项(比一个级别更深),我需要深度副本,所以我很高兴人们提到它。对你有好处。你最好问问那些认为这更容易理解的人。我只是告诉那些希望使用PrototypeJS的人如何使用PrototypeJS。除了与巨魔无关之外,这里没有其他的关联,但是我喜欢JQuery用于列表操作。不幸的是,您总是必须使用列表运算符,而我通常希望对简单的标量对象进行操作。