Рамда была написана за ES5 дней и нуждалась в поддержке ES3.С момента появления ES6 есть много вещей, которые Ramda действительно улучшил для старых JS, которые теперь проще в vanilla JS.Обратите внимание, что я основатель Ramda и большой поклонник, но благодаря деструктуризации, функциям стрелок, параметрам по умолчанию, строкам шаблонов и многим другим, пропуская Ramda часто проще.
Вот простой JSрешение:
const denormalize = (steps) => (store) =>
steps.reduce(
(s, [key, foreignKey, target, targetId, newKey]) => ({
...s,
[key]: s[key].map(({[foreignKey]: fk, ...rest}) => ({
...rest,
[newKey]: s[target].find(x => x[targetId] == fk)
}))
})
, store
)
const updateStore = denormalize([
['teams', 'regionId', 'regions', 'id', 'region'],
['users', 'teamId', 'teams', 'id', 'team'],
])
const store = {users: [{teamId: "team-1", name: "user 1"}, {teamId: "team-2", name: "user 2"}], teams: [{id: "team-1", regionId: "region-1", name: "Team 1"}, {id: "team-2", regionId: "region-2", name: "Team 2"}], regions: [{id: "region-1", name: "Region 1"}, {id: "region-2", name: "Region 2"}]}
console.log(updateStore(store).users)
Обратите внимание, что это делает всю денормализацию, возвращая объект со всеми денормализованными данными.Мы просто извлекаем users
из него.Очевидно, что мы могли бы добавить еще одну обертку, чтобы возвращать только ту часть, которую мы хотим, но, похоже, это все равно будет полезно.(Таким образом, вы можете получить денормализованное свойство teams
, если хотите.)
Это идет на шаг дальше вашего запроса, опуская внешние ключи и заменяя их внешним объектом.Это было просто основано на неправильном понимании того, что вы хотели, или, возможно, на мысли, что это то, что я хочу (;-)).Таким образом, результаты выглядят следующим образом:
[
{
name: "user 1",
team: {
id: "team-1",
name: "Team 1",
region: {
id: "region-1",
name: "Region 1"
}
}
}, /*... */
]
Если вы хотите сохранить эти внешние ключи, код будет немного проще:
const denormalize = (steps) => (store) =>
steps.reduce(
(s, [key, foreignKey, target, targetId, newKey]) => ({
...s,
[key]: s[key].map(t => ({
...t,
[newKey]: s[target].find(x => x[targetId] == t[foreignKey])
}))
})
, store
)
Что означают все эти строки в steps
параметр может быть неясным.Если это так, вы можете заменить его следующим:
const config = [
{key: 'teams', foreignKey: 'regionId', target: 'regions', targetId: 'id', newKey: 'region'},
{key: 'users', foreignKey: 'teamId', target: 'teams', targetId: 'id', newKey: 'team'},
]
и просто изменить первую строку reduce
на
(s, {key, foreignKey, target, targetId, newKey}) => ({
(Это просто изменение с [ ... ]
на{ ... }
.)