这样做有更简洁或可读的方法吗?
var foo={a:111,c:333, somePropertyThatShouldntBeAdded:'xxx'};
var myobj={x:1,y:2,z:3};
if(foo.a){myobj.a=foo.a;}
if(foo.b){myobj.b=foo.b;}
if(foo.c){myobj.c=foo.c;}
EDIT。我正在这样做的背景如下。
var obj={value:this.text,css:{color:'#929292',margin:'1px 0px'}};
if(this.width){obj.css.width=this.width;}
if(this.type){obj.type=this.type;}
if(this.id){obj.id=this.id;}
var input=$('<input/>',obj)
答案 0 :(得分:1)
您可以使用简单的基于循环的方法:
var foo={a:111,c:333, somePropertyThatShouldntBeAdded:'xxx'};
var myobj={x:1,y:2,z:3};
['a','b','c'].forEach(function(key) {
if(key in foo) {
myobj[key] = foo[key];
}
});
注意我是如何使用in
关键字的。如果属性的值为(例如)false
或0
,则您当前的解决方案将无效。
另外,为了获得更好的解决方案,请提供一些上下文:为什么有条件地复制属性?也许你可以开始避免这种情况。
答案 1 :(得分:0)
您可以像这样使用三元运算符:
myobj.a = foo.a ? foo.a : undefined;
虽然它与if语句不完全相同,因为您将{a: undefined}
代替{}
。如果您枚举了对象的键,则会显示差异。
修改强>
@hindmost在评论中有一个很好的建议。您可以使用underscore.js进一步改进它:
_.extend(myobj, _.pick(foo, ['a', 'b', 'c']));
答案 2 :(得分:0)
您可以使用jQuery&#39; extend
,然后使用delete
您不想要的属性:
function extendExcept(sourceObject, targetObject, except) {
var target = $.extend(sourceObject, targetObject);
except.forEach(function(key) {
delete target[key];
});
return target;
}
你可以这样称呼:
var foo={a:111,c:333, somePropertyThatShouldntBeAdded:'xxx'};
var myobj={x:1,y:2,z:3};
myobj = extendExcept(foo, myobj, ["somePropertyThatShouldntBeAdded"]);
答案 3 :(得分:0)
var foo = {
a: 111,
c: 333,
somePropertyThatShouldntBeAdded: 'xxx'
};
var myObj = {
x: 1,
y: 2,
z: 3
};
for(var key in foo) {
if(key === 'somePropertyThatShouldntBeAdded') {
continue;
}
myObj[key] = foo[key];
}
答案 4 :(得分:0)
ES2018中引入了散布运算符后,您可以执行以下操作。
const original = {
first: null,
second: 'truthy'
};
const conditionalObject = {
...( original.first && { first: original.first }),
...( original.second && { second: original.second })
};
在conditionalObject
中,我们首先检查要从original
添加的属性是否正确,如果是,则将该属性及其值传播到新对象中。
如果原始对象的属性虚假,则&&
短路,并且该属性永远不会传播到新对象中。
您可以阅读更详细的说明here
新的conditionalObject
看起来像这样
{
second: 'truthy'
}