Modern selector/picker library utilizing JavaScript template literals.
const data = {
weather: {
data: {
days: [{
conditions: {temperatuer: 26}
}]
}
}
});
pick`weather.data.days[0].conditions.temperature`()(data);
// ๐ 26
Let's say you have a normalized Redux store.
{
users: {
byId: {
// 1: {}
// 2: {}
// 3: {}
}
}
}
And you want to select all users aged over 18.
const getUsersOver18 = pick`users.byId${({age}) => age > 18}`();
Let's make the age threshold variable.
const getUsersOver = pick`users.byId${({age}) => over => u.age > over}`;
const getUsersOver18 = getUsersOver(18);
Let's limit the number of users to only first five.
const getUsersOver = pick`users.byId${u => over => u.age > over}${'0:5'}`;
Let's select only id
and name
fields.
const getUsersOver = pick`users.byId${u => over => u.age > over}${'0:5'}->{id,name}`;
Let's instead select only the last user and reformat our query to make it look smart.
const getUsersOver = pick`
users.byId
${u => over => u.age > over}
${'-1:'}
->{id,name}
`;
Let's break it down.
users.byId
โ this is an accessor, it is compiled tostate = state.users.byId
.${u => over => u.age > over}
โ this filter expression is compiled tostate = state.filter(u => u.age > over)
.${'-1:'}
โ this is a range expression instart:end:step
format, it is compiled internally to a filter, too.->
โ map operator->
tells us to dostate = state.map(...)
over the result set.{id,name}
โ destructuring accessor is internally compiled tostate = (({id, name}) => ({id, name})(state)
.
All-in-all the above query is compiled to a JavaScript function like this:
const getUsersOver = (over) => (state, def) => {
try {
state = state.users.byId;
state = Object.values(state);
state = state.filter(u => u.age > over);
state = state.filter((_, i) => i === state.length - 1);
state = state.map(({id, name}) => ({id, name}));
return state;
} catch {
return def;
}
};
Install.
npm i modern-pick
Import.
import {id, idx, pick} from 'modern-pick';
Unlicense โ public domain.