Контекст
В процессе разработки мы часто сталкиваемся с ситуацией, когда нам приходится создавать экземпляры или изменять свойства объекта условно.
Допустим, мы ищем пользователя по электронной почте, фамилии и/или имени.
В большинстве случаев запрос со значением свойства falsy, таким как null или undefined, не вернет ничего хорошего, поэтому мы должны добавить их условно на основе о наличии аргумента.
Применение
// Add a property conditionally let object = { ...(true && { key: "value" }) }; // { key: "value" }; // Override a property conditionally object = { key: 1, ...(true && { key: 2 }) }; // { key: 2 }; object = { key: 1, ...(false && { key: 2 }) }; // { key: 1 };
Объяснение
const body = {}; const query = {}; if (body.email) { query.email = body.email; } if (body.lastname) { query.lastname = body.lastname; } if (body.firstname) { query.firstname = body.firstname; } // query = {}
Итак, вернемся к нашему примеру. Если мы хотим отфильтровать пользователей по нескольким параметрам, лучше применять только каждый фактически заданный параметр, чтобы избежать возврата каждого пользователя с определенной фамилией, которая также имеет null в качестве имя и адрес электронной почты, так как мы их не предоставили.
Для этого мы должны добавить каждый параметр в зависимости от их присутствия. Первый метод, который может прийти вам в голову, — это использовать простое условное выражение, подобное этому:
Но почему бы не воспользоваться одной из лучших функций ES6: Деструктуризация.
Для тех, кто не знает, как это работает, деструктуризация в основном позволяет извлекать элементы массива или объекта, поэтому в нашем случае допустим, что у нас есть поисковый запрос для пользователя с конкретная фамилия:
const body = { lastname: "Doe" }; const query = { ...(body.email && { email: body.email }), ...(body.lastname && { lastname: body.lastname }), ...(body.firstname && { firstname: body.firstname }), }; // { lastname: "Doe" }
Как видите, к объекту запроса добавляется только параметр lastname, что позволяет нам возвращать каждого пользователя с именем «Doe» в качестве фамилии и опускать условие, при котором имя и электронная почта являются нулевыми, так как есть ложные.
Заключение
Здесь у вас есть краткое решение для условного добавления свойств к объекту на основе любого условия, которое вы хотите, здесь мы просто пошли на их наличие.
Окончательный результат рефакторинга будет выглядеть так:
const query = { ...(email && { email }), ...(lastname && { lastname }), ...(firstname && { firstname }), };
Первоначально опубликовано наhttps://blog.melvinvmegen.com/snippets/destructuring 15 мая 2023 г.