Полезные трюки
Я уже писал как-то про Юзкейсы …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'
Ну такое, но рабочее.