簡體   English   中英

有條件地設置對象屬性

[英]Conditionally set an object property

是否有一些基於條件設置屬性的語法?

data: {
    userId: 7,
    actionId: 36,
    express: (myCondition ? true : null) // does not work
}

我希望express要么設置為一個值,要么根本不設置(即,應該沒有名為express鍵),並且在定義之后沒有額外的語句。 我知道我可以將它用作布爾值,但接收方正在使用isset()檢查,我想知道是否可以避免修改它。


編輯:似乎沒有直接解決上述問題的方法。 以下是接近的建議:

JSON.stringify (Chris Kessel,dystroy):

var json = JSON.stringify( {
    data: {
        userId: 7,
        actionId: 36,
        express: (myCondition ? true : null)
    }
});

匿名函數(Paulpro):

var data = new function(){
    this.userId = 7;
    this.actionId = 36;
    myCondition && (this.express = true);
};

額外的語句(x4rf41):

data: {
    userId: 7,
    actionId: 36
}
if(myCondition) data["express"] = true;

Eval (我的前同事):

eval("data = {userId: 7, actionId: 36 " + (myCondition ? ", express: true}" : "}"))

條件定義(真的不知道如何標記這個):

data = (
    (myCondition && { userId: 7, actionId: 36, express: true }) ||
    (!myCondition && { userId: 7, actionId: 36 })
);

使用擴展運算符

data: {
    userId: 7,
    actionId: 36,
    ...myCondition && {express: true}
}

請注意,如果您使用Flow ,則該語法可能會生成類型檢查錯誤。 您可以更明確、更簡潔地編寫上述內容,如下所示:

data: {
    userId: 7,
    actionId: 36,
    ...(myCondition ? {express: true} : {})
}

像這樣做 :

data: {
    userId: 7,
    actionId: 36,
    express: (myCondition ? true : undefined)
}

將對象字符串化為JSON 時,不會寫入值undefined屬性。


編輯:從評論看來,實際上沒有涉及 JSON。 OP 正在使用$.ajax因此可能使用了$.param 不幸的是, $.param確實為值為undefined屬性創建了一個條目。 因此,如果沒有任何補充代碼行,可能就沒有解決方案。

如果您使用匿名函數而不是對象文字表示法定義對象,則可以這樣做:

var data = new function(){
    this.userId = 7;
    this.actionId = 36;
    myCondition && (this.express = true);
};

結果data對象完全相同,除了它的constructor將是匿名函數而不是window.Object

你可以這樣做:

var json = JSON.stringify( {
    data: {
        userId: 7,
        actionId: 36,
        express: (myCondition ? true : null)
    }
});

有點舊,但也有一個很好的解決方案,您可以這樣做:

data: {
    userId: 7,
    actionId: 36
}

Object.assign(data, !myCondition && { express: yourValue });

因此,如果您的條件為假,它將為您的 express 屬性分配您需要的值。

首先,那是 javascript,而不是 JSON。

解決方案:

data: {
    userId: 7,
    actionId: 36
}
if(myCondition) data["express"] = true;

擴展運算符現在修復了這個問題。 這是一個有兩個比較的例子。

注意:我將date:更改為const date =以便它是有效的可運行 javascript。 這也可以用於data:如果它應該在深層對象結構內部。

 const compareValue = 13; const data = { userId: 7, actionId: 36, ...(compareValue > 10 && {propertyForGreaterThan10: 'foo'}), ...(compareValue < 10 && {propertyForLessThan10: 'bar'}), } console.log(data);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM