Полезные трюки

Я уже писал как-то про Юзкейсы …spread оператора. За прошедшее время накопилось много чего еще интересного. Пришла пора рассказать про эти трюки, которые могут быть полезны в работе.

Rename key

var obj = { key: 'value' }
obj = (({ key, ...other })=>({ newKey: key, ...other }))(obj)
// { newKey: 'value' }

Таким образом вы можете поменять имя конкретного ключа.

Условные выражения

Вы можете использовать условные выражения внутри spread синтаксиса:

const getUserObject = (user, email) => ({
...user,
...(email && { email })
});
const user = { id: 1, name: 'Alex' }
const email = 'som@mail.ru'
getUserObject(user, email);
// { id: 1, name: 'Alex', email: 'som@mail.ru' }
getUserObject(user);
// { id: 1, name: 'Alex' }

Нормализация объектов или установка дефолтных значений

Можно сделать красивую функцию для установки дефолтных значений:

const normalizeUserObject = ({
uid = Date.now().toString(16),
create = new Date,
...other
}) => ({
uid, create, ...other
})
;
const user = { name: 'Alex' }
normalizeUserObject(user);
// { uid: '1699600ff16', create: 2019-03-19T12:50:41.558Z, name: 'Alex' }

Перестановка ключей

С ходу не скажу юзкейс где и когда, но если вдруг, то:

var obj = {
foo: 1,
bar: 2,
buz: 3
}
// move buz to top
obj = (obj=>({ buz: void null, ...obj }))(obj);
// { buz: 3, foo: 1, bar: 2 }
// move foo to the end
obj = (({foo, ...obj})=>({ ...obj, foo }))(obj);
// { buz: 3, bar: 2, foo: 1 }

Функциональный способ удалить ключ

В мире мутабильности, одним словом в нормальном мире, чтобы удалить свойство вы бы написали просто:

'use strict';
const obj = {
foo: 1,
bar: 2,
buz: 3
}
delete obj.foo;
console.log(obj); // { bar: 2, buz: 3 }

Но если вы функциональщик и поклонник монад, функторов и прочих ругательных слов, то вам религия не позволит так писать. Вы будете решать эту задачу так:

'use strict';
const obj = {
foo: 1,
bar: 2,
buz: 3
}
const removeProp = prop => ({ [prop]: _, ...rest }) => rest;
const removeFoo = removeProp('foo')
removeFoo(obj)
// { bar: 2, buz: 3 }

Swap Key with Value

В качестве идеи, не очень законченной… Не нравится реализация, пока думаю как сделать лучше, но если прям хочется поменять местами ключ и значение, можно наваять такую конструкцию:

const obj = {
key: 'value',
foo: 'bar'
}
const swap_key = prop =>
function ({ [prop]:_, ...rest }){
return ({ [arguments[0][prop]]:prop,...rest })
}
;
swap_key('key')(obj);
// { value: 'key', foo: 'bar'

Ну такое, но рабочее.