有条件地向JavaScript对象添加属性

时间:2015-04-25 16:35:22

标签: javascript jquery oop

这样做有更简洁或可读的方法吗?

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)

5 个答案:

答案 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关键字的。如果属性的值为(例如)false0,则您当前的解决方案将无效。

另外,为了获得更好的解决方案,请提供一些上下文:为什么有条件地复制属性?也许你可以开始避免这种情况。

答案 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"]);

Working Example

答案 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'
}