我如何合并2个javascript对象,如果它们不';不存在于另一个世界?
如果我有如下定义的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) {
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用于列表操作。不幸的是,您总是必须使用列表运算符,而我通常希望对简单的标量对象进行操作。