Разрушение вложенных объектов: как получить родительские и дочерние значения?
В приведенной ниже функции я получаю объект textarea со свойством current
,
Здесь вложенная деструктура работает с Start
а также End
переменные. Но current
переменная не работает.
function someFunction({ current: { selectionStart: Start, selectionEnd: End } }, AppStateSetter) {
// do something with current, Start, and End
}
2 ответа
Первая деструкция создает только Start
а также End
переменные. Если вы хотите создать current
как переменную, то вам нужно объявить это снова.
function ({ current: { selectionStart: Start, selectionEnd: End }, current }, AppStateSetter) {
// do something with current , Start , and End
}
Вы можете проверить это на компиляторе Babel:
Этот код:
const object = {
current: {
selectionStart: "prop 1",
selectionEnd: "prop2"
}
}
const { current: { selectionStart: Start, selectionEnd: End } } = object;
Получает trasnpiled к:
var object = {
current: {
selectionStart: "prop 1",
selectionEnd: "prop2"
}
};
var _object$current = object.current,
Start = _object$current.selectionStart,
End = _object$current.selectionEnd;
Как вы видете, current
переменная не создана.
Я думаю, что проблема, с которой вы сталкиваетесь, возникает, когда ток undefined
,
Вы можете попробовать уничтожить со значением по умолчанию.
function ({ current: { selectionStart: Start, selectionEnd: End } = {} }, AppStateSetter) {
// do something with Start and End
}
Если вы думаете, что вам нужно получить доступ current
также попытайтесь разрушить внутри функции.
function ({ current = {}}, AppStateSetter) {
const { selectionStart: Start, selectionEnd: End } = current
// do something with current, Start and End
}
Вы можете деструктурировать и назначить значение по умолчанию в одном операторе.
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
}
Если вы не хотите назначать текущее значение по умолчанию, но по-прежнему хотите использовать эту переменную, вы можете просто написать имя свойства без присваивания. Когда someFunction вызывается с пустым объектом, если вы не назначите текущее значение по умолчанию, оно будет неопределенным.
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: деструктуризация вложенных объектов со значениями по умолчанию и без них