当前位置: 首页 > 知识库问答 >
问题:

如何有条件地向javascript对象文字添加属性

狄安歌
2023-03-14

我正在尝试执行以下操作以满足代码构建器的要求(具体来说是Sencha Cmd)。

这是我需要做的本质。关键因素是函数体必须以返回对象文字结束。由于生成器中的限制,我无法返回变量。那么,如果参数includeB为true,如何在下面的伪代码点添加属性“b”,但如果为false,则根本不添加属性。不允许ie b==未定义或b==null。

也许这是不可能的。

function create(includeB) {
        // Can have code here but the final thing MUST be a return of the literal.
        // ...
    return {
        a : 1
        // pseudo code:
        // if (includeB==true) then create a property called b 
        // and assign a value of 2 to it. 
        // Must be done right here within this object literal
    }
}

var obj = create(false);
// obj must have property 'a' ONLY

var obj = create(true);
// obj must have properties 'a' and 'b'

感谢阅读和考虑,

默里

共有3个答案

贡和裕
2023-03-14

您不能将布尔逻辑放入javascript文字定义中。因此,如果您的构建器要求返回的对象只能定义为javascript文字,那么您不能以这种方式有条件地定义属性。

如果您可以在函数中创建一个对象,使用逻辑修改该对象,然后返回该对象,那么这很容易。

function create(includeB) {
    var x = {
        a: 1
    };
    if (includeB) {
        x.b = 2;
    }
    return x;
}

您的另一个选择是包装创建函数并在创建函数之外执行。

function myCreate(includeB) {
    var x = create(includeB)
    if (includeB) {
        x.b = 2;
    }
    return x;
}

或者,您甚至可以透明地包装create函数,以便调用者仍然使用create(),但它的行为已被更改。

var oldCreate = create;
create = function(includeB) {
    var x = oldCreate(includeB);
    if (includeB) {
        x.b = 2;
    }
    return x;
}
蓬化
2023-03-14

您几乎已经展示了构造函数的用例,而不是使用对象文字:

function CustomObject(includeB) {
    this.a = 1;
    if (includeB) {
        this.b = 2;
    }
}

//has `a` only
var obj1 = new CustomObject(false);

//has `a` and `b`
var obj2 = new CustomObject(true);

重新阅读您的问题后,似乎您在修改函数方面的访问权限有限。如果我正确理解了您的问题,您只能更改脚本的有限部分:

function create(includeB) {
    // modifications may be done here

    // the rest may not change
    return {
        a : 1
    }
}

var obj = create(false);
// obj must have property 'a' ONLY

var obj = create(true);
// obj must have properties 'a' and 'b'

如果是这种情况,那么您可以简单地跳过函数的后面部分:

function create(includeB) {
    if (includeB) {
        return {
            a: 1,
            b: 2
        };
    }
    return {
        a: 1
    };
}
沙星波
2023-03-14

如果可以使用ES6,请使用排列属性。

function create(includeB) {
    return {
        a : 1,
        ...(includeB ? { b: 2 } : {}),
    };
}
 类似资料:
  • 我想有条件地向对象添加一个属性。目前我有这个: 问题是如果汽车。电池不存在我有电池:未定义。如果对象中不存在该属性,我宁愿不要该属性。我怎样才能做到这一点?

  • 我想创建一个有条件添加成员的对象。简单的方法是: 现在,我想写一段更地道的代码。我正在尝试: 但是现在,

  • 问题内容: 如果满足特定条件,是否有办法仅向React组件添加属性? 我应该在渲染后基于Ajax调用将required和readOnly属性添加到表单元素中,但是由于readOnly =“ false”与完全省略该属性不同,因此我看不到如何解决此问题。 下面的示例应解释我想要的内容,但将无法正常工作(解析错误:意外的标识符)。 问题答案: 显然,对于某些属性,如果您传递给它的值不真实,React足

  • 问题内容: 我想创建一个有条件添加成员的对象。简单的方法是: 现在,我想编写一个更惯用的代码。我在尝试: 但是,现在是,其值为的成员。这不是期望的结果。 有方便的解决方案吗? 更新资料 我寻求一个可以解决几个成员的一般情况的解决方案。 问题答案: 在纯Javascript中,我想不出比您的第一个代码片段更惯用的东西。 但是,如果不是不可能使用jQuery库,那么$.extend()应该符合您的要求

  • 问题内容: STORE = { item : function() { } }; STORE.item.prototype.add = function() { alert(‘test 123’); }; STORE.item.add(); 一段时间以来,我一直在试图找出问题所在。为什么不起作用?但是,当我使用以下命令时,它可以工作: 问题答案: 原型对象应在构造函数上使用,基本上是将使用new运

  • 问题内容: 这件事困扰了我一段时间。我为什么不能做: …虽然我可以执行以下操作? 这是什么规则?您能给我介绍一下吗? 问题答案: 您可以向具有的任何对象添加属性。 例如,没有它。 字符串和其他简单的内置对象也没有它。 使用类也没有它。 除非前面的声明适用,否则用定义的类都具有它。 如果使用/的对象没有/ ,通常是为了节省空间。例如,如果有一个命令,那就太过分了- 想象一下一个非常短的字符串的膨胀程