javascript - normalizr 可以在规范化数据上创建索引吗?
问题描述
我使用 normalzr 来规范化我的 Redux 存储中的数据。但是,我无法弄清楚如何在规范化数据上创建规范化索引。这是我在没有 normalizr 的情况下解决它的方法:
var postData = [
{ id: 101, pet: "dog", sleeps: "bed", likesme: "yes" },
{ id: 102, pet: "cat", sleeps: "porch", likesme: "no" },
{ id: 103, pet: "fish", sleeps: "bowl", likesme: "yes" },
{ id: 104, pet: "rock", sleeps: "porch", likesme: "yes" }
];
const indexer = (objarr, idcol, indexcol) => {
var retobj = {};
objarr.forEach((row)=>{
var index = row[indexcol];
if (retobj[index] == null)
retobj[index] = [];
retobj[index].push(row[idcol]);
});
return(retobj);
};
var bySleeps = indexer(postData,"id","sleeps");
console.log(bySleeps);
var byLikesMe = indexer(postData,"id","likesme");
console.log(byLikesMe);
产生:
{ bed: [ 101 ], porch: [ 102, 104 ], bowl: [ 103 ] }
{ yes: [ 101, 103, 104 ], no: [ 102 ] }
示例用法:
var state.petsThatLikeMe = byLikesMe["yes"];
var state.petsThatDontLikeMe = byLikesMe["no"];
解决方案
你可以这样做,这将生成所有可能的键及其值和属于这些值的 id。
如果您将更频繁地触发此生成,那么缓存(记忆)结果是一个好主意,尤其是当数据集变得更大时。
console.log(likesme);
{
"yes": [
101,
103,
104
],
"no": [
102
]
}
console.log(likesme.yes);
[
101,
103,
104
]
console.log(sleeps.bed)
[
101
]
var postData = [
{ id: 101, pet: "dog", sleeps: "bed", likesme: "yes" },
{ id: 102, pet: "cat", sleeps: "porch", likesme: "no" },
{ id: 103, pet: "fish", sleeps: "bowl", likesme: "yes" },
{ id: 104, pet: "rock", sleeps: "porch", likesme: "yes" }
];
function generate(data){
return data.reduce((state, entry) => {
Object.entries(entry).forEach(([subject, value]) => {
if (subject in state) {
value in state[subject] ?
state[subject][value].push(entry.id) :
state[subject][value] = [entry.id]
} else {
if (subject !== 'id') state[subject] = {[value]: [entry.id]};
}
});
return state;
}, {});
}
const { likesme, sleeps, pet } = generate(postData)
console.log(likesme);
console.log(likesme.yes);
console.log(sleeps.bed)
推荐阅读
- docker - docker 在镜像中创建的文件没有反映在 docker compose 运行的容器中
- cql - Geoserver 上的 WMS 请求栅格 (GeoTIFF)
- javascript - 如何在 JavaScript 循环中进行 GET 调用?
- qt - Qt 无法识别 Red Hat 8 中的 Numlock
- python - 反序列化,Avro 中的固定数据类型
- visual-studio - 如何将项目升级到 .NET Core 3.1.18
- lua - 如何在lua中制作自定义++、-=、+=运算符?
- anaconda - 更新运行更新后——所有 anaconda + Spyder 都消失了
- hybrid-mobile-app - 带有 Svelte 和没有 webviews 的混合应用程序
- python - Python exec(open("file_name.py").read()) 访问磨损变量