Javascript Normalizer能否在规范化数据上创建索引?

Javascript Normalizer能否在规范化数据上创建索引?,javascript,indexing,normalization,Javascript,Indexing,Normalization,我使用normalzr规范化我的Redux存储中的数据。但是,我不知道如何在规范化数据上创建规范化索引。下面是我如何在没有normalizer的情况下解决它的: var postData = [ { id: 101, pet: "dog", sleeps: "bed", likesme: "yes" }, { id: 102, pet: "cat", sleeps: "porch", likesme: "no" }, { id: 103, pet: "fish", sleeps: "bowl"

我使用normalzr规范化我的Redux存储中的数据。但是,我不知道如何在规范化数据上创建规范化索引。下面是我如何在没有normalizer的情况下解决它的:

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.loglikesme

console.loglikesme.yes

控制台

var postData=[ {id:101,宠物:狗,睡觉:床,像我:是的}, {id:102,宠物:猫,睡觉:门廊,像我:不}, {id:103,宠物:鱼,睡觉:碗,喜欢我:是的}, {id:104,宠物:摇滚,睡觉:门廊,喜欢我:是的} ]; 函数生成数据{ return data.reducestate,条目=>{ Object.entriesentry.forEach[主题,值]=>{ 如果主体处于状态{ 状态[主题]中的值? 状态[subject][value]。pushentry.id: 状态[subject][value]=[entry.id] }否则{ 如果主题!='id'状态[subject]={[value]:[entry.id]}; } }; 返回状态; }, {}; } const{likesme,sleeps,pet}=generatepostData console.loglikesme; console.loglikesme.yes;
console.logsleeps.bedIm不熟悉normalizer。但我可以想象,id被用来规范化数据。在你们的例子中,bed并不是唯一的,所以我认为仅仅使用Normalizer很难产生你们当前的结果。我同意。normalizer将创建{'101':{…obj},'102':{obj},…}。npm上有索引工具,但我想要一个与normalizer一起工作的。我可能有东西给你。检查我的答案,希望它能帮助你。。
{
  "yes": [
    101,
    103,
    104
  ],
  "no": [
    102
  ]
}
[
  101,
  103,
  104
]
[
  101
]