The function below receives an object that has a property current
, which is also an object, and it has selectionStart
and selectionEnd
properties.
Here, nested destructuring works as expected with Start
and End
variables, But I also need the value for current
.
function someFunction({ current: { selectionStart: Start, selectionEnd: End } }) {
// do something with current, Start, and End
}
How do I get it using destructuring?
The function below receives an object that has a property current
, which is also an object, and it has selectionStart
and selectionEnd
properties.
Here, nested destructuring works as expected with Start
and End
variables, But I also need the value for current
.
function someFunction({ current: { selectionStart: Start, selectionEnd: End } }) {
// do something with current, Start, and End
}
How do I get it using destructuring?
Share Improve this question edited Aug 26, 2021 at 9:13 soufiane yakoubi asked Feb 8, 2019 at 11:19 soufiane yakoubisoufiane yakoubi 95112 silver badges31 bronze badges 3 |3 Answers
Reset to default 26The first destructuring creates only Start
and End
variables. If you want to create current
as a variable, then you need to declare it again.
function ({ current: { selectionStart: Start, selectionEnd: End }, current }, AppStateSetter) {
// do something with current , Start , and End
}
You can test it on the Babel compiler:
This code:
const object = {
current: {
selectionStart: "prop 1",
selectionEnd: "prop2"
}
}
const { current: { selectionStart: Start, selectionEnd: End } } = object;
Gets trasnpiled to:
var object = {
current: {
selectionStart: "prop 1",
selectionEnd: "prop2"
}
};
var _object$current = object.current,
Start = _object$current.selectionStart,
End = _object$current.selectionEnd;
As you can see, current
variable is not created.
I think the issue you are facing happens when current is undefined
.
You can try destructing with default value.
function ({ current: { selectionStart: Start, selectionEnd: End } = {} }, AppStateSetter) {
// do something with Start and End
}
If you think you need to access current
as well, try destructuring inside the function.
function ({ current = {}}, AppStateSetter) {
const { selectionStart: Start, selectionEnd: End } = current
// do something with current, Start and End
}
You can destructure and assign the default value in a single statement.
function someFunction({
current: {
selectionStart: Start,
selectionEnd: End
} = {},
current = {}
},
AppStateSetter) {
// now you can use the let variables Start, End and current,
// with current's default value set to empty object
}
If you don't want to assign default value to current, but still want to use that variable, you can just write the name of the property with no assignment. When someFunction is called with empty object, if you don't assign a default value to current it will be undefined.
function someFunction1({
current: {
selectionStart: Start,
selectionEnd: End
} = {},
current
},
AppStateSetter) {
// now you can use the let variables Start, End and current
// if empty object is passed, current will be undefined
}
JsFiddle snippet: Nested object destructuring with and without default values
Start
andEnd
are working properly, butcurrent
is undefined. @adiga has just answered this. – caesay Commented Feb 8, 2019 at 11:26