Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Conditionally set an object property

Tags:

javascript

Is there some syntax for setting properties based on a condition?

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

I want express to be either set to a value or not set at all (i.e., there should be no key named express), and without extra statements after the definition. I know I can use it as a boolean, but the receiving side is using an isset() check and I'm wondering if I can avoid modifying it.


Edit: Seems there is no direct solution to the problem as stated. Here are the close suggestions:

JSON.stringify (Chris Kessel, dystroy):

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

An anonymous function (Paulpro):

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

An extra statement (x4rf41):

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

Eval (a former colleague of mine):

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

Conditional definition (don't really know how to label this one):

data = (
    (myCondition && { userId: 7, actionId: 36, express: true }) ||
    (!myCondition && { userId: 7, actionId: 36 })
);
like image 596
mcmlxxxvi Avatar asked Aug 02 '13 14:08

mcmlxxxvi


People also ask

How do you check if an object has a specific property in JavaScript?

We can check if a property exists in the object by checking if property !== undefined . In this example, it would return true because the name property does exist in the developer object.

Can a property of an object be an array?

Just as object properties can store values of any primitive data type (as well as an array or another object), so too can arrays consist of strings, numbers, booleans, objects, or even other arrays.

How do you set a property for an object?

After you have created an object, you can set or change its properties by calling the property directly with the dot operator (if the object inherits from IDL_Object) or by calling the object's SetProperty method.


7 Answers

Use the spread operator.

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

Note that if you're using Flow, that syntax might generate type check errors. You can write the above more explicitly, and less succinctly, as:

data: {
    userId: 7,
    actionId: 36,
    ...(myCondition ? {express: true} : {})
}
like image 186
ericsoco Avatar answered Oct 05 '22 18:10

ericsoco


You can do it if you define your object using an anonymous function instead of object literal notation:

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

The resulting data object is the exact same, except it's constructor will be the anonymous function instead of window.Object.

like image 44
Paul Avatar answered Oct 05 '22 17:10

Paul


Do it like this :

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

A property whose value is undefined isn't written when you stringify the object to JSON.


EDIT : It appears from the comments that there is no JSON involved in fact. OP is using $.ajax so $.param is probably used. $.param, unfortunately, does create an entry for properties whose value is undefined. So there's probably no solution without any supplementary line of code.

like image 25
Denys Séguret Avatar answered Oct 05 '22 17:10

Denys Séguret


You could do something like this:

var json = JSON.stringify( {
    data: {
        userId: 7,
        actionId: 36,
        express: (myCondition ? true : null)
    }
});
like image 44
Chris Kessel Avatar answered Oct 05 '22 18:10

Chris Kessel


first of all, thats javascript, not JSON.

the solution:

data: {
    userId: 7,
    actionId: 36
}
if(myCondition) data["express"] = true;
like image 31
x4rf41 Avatar answered Oct 05 '22 18:10

x4rf41


A bit old but there is a good solution as well you can do :

data: {
    userId: 7,
    actionId: 36
}

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

Thus it will assign your express property with the value you need if your condition is false.

like image 37
Imad El Hitti Avatar answered Oct 05 '22 17:10

Imad El Hitti


The spread operator now fixes this. Here is an example with two comparisons.

Note: I changed date: to const date = so that it is valid runnable javascript. This can also be used with data: if it is supposed to be inside of a deep object structure.

const compareValue = 13;
const data =  {
    userId: 7,
    actionId: 36,
    ...(compareValue > 10 && {propertyForGreaterThan10: 'foo'}),
    ...(compareValue < 10 && {propertyForLessThan10: 'bar'}),
}
console.log(data);
like image 25
RobKohr Avatar answered Oct 05 '22 18:10

RobKohr