我有一个产生类似三元组的对象的服务。它们将采用这种格式:
{ country, attribute, value }
示例:
{ country: 'usa', attribute: 'population', value: 100 }
{ country: 'mexico', attribute: 'population', value: 200 }
{ country: 'usa', attribute: 'areaInSqM', value: 3000 }
最后,我想把这些显示成一张桌子。行是国家,列是属性。所以这张桌子看起来像:
| country | population | areaInSqM |
| usa | 100 | 3000 |
| mexico | 200 | |
我的假设(可能是错误的)是,我需要创建一个中间数据结构,它是一个行数组。例如:
[ { country: 'usa', population: 100, areaInSqM: 3000 }, .... ]
我目前的解决方案是一个非RxJS混乱的对象,其中我存储一个包含每个属性类型的集合,存储一个按国家索引的查找对象,并在最后将查找对象转换回上述数组。很多循环和双储藏室,我宁愿避免。
RxJS是否有任何帮助这类操作的操作员?
有没有更聪明的方法?
在这种情况下,假设是:
编辑: Plunkr与解决方案:https://plnkr.co/edit/FVoeVmmzMN7JGJ3zWFQM?p=preview
发布于 2017-04-10 14:05:48
在您的问题中有两个组件,数据结构部分和数据流部分(我假设您将这些数据作为一个流,即一个一个地得到,这就是您使用Rxjs的原因)。
迭代构建数据结构的一个简单方法是使用scan
运算符。例如:
myDataStructure$ = dataSource$.scan(function (accDataStructure, triple){
accDataStructure[triple.country] = accDataStructure[triple.country] || {}
accDataStructure[triple.country][triple.attribute] = accDataStructure[triple.country][triple.attribute] || {}
accDataStructure[triple.country][triple.attribute] = triple.value
return accDataStructure
}, {})
这就假设dataSource$生成形状为{ country, attribute, value }
的对象。然后,myDataStructure$
将为每一个传入的数据输出您正在寻找的迭代构建的数据结构。如果您只希望该数据结构在构建完成后,只需向.last()
添加一个myDataStructure$
即可。
这是没有测试的,所以请告诉我这是否有效。
https://stackoverflow.com/questions/43332674
复制相似问题