使用javascript和组合值减少JSON对象中的冗余信息
我有一个CSV的结果,查看图片,猜测图片是否包含某个属性。在这种情况下,如果图片中的对象是男性或女性 我正在使用javascript/node将这个CSV转换为JSON,我希望获取属性及其值,并将它们放入每个pciture中一个对象的数组中。现在CSV的每一行度量和属性,但它意味着每个图像至少有两行 csv的简单版本:使用javascript和组合值减少JSON对象中的冗余信息,javascript,node.js,json,csv,lodash,Javascript,Node.js,Json,Csv,Lodash,我有一个CSV的结果,查看图片,猜测图片是否包含某个属性。在这种情况下,如果图片中的对象是男性或女性 我正在使用javascript/node将这个CSV转换为JSON,我希望获取属性及其值,并将它们放入每个pciture中一个对象的数组中。现在CSV的每一行度量和属性,但它意味着每个图像至少有两行 csv的简单版本: path, detect_id, score, x-coord, y-coord, w-coord, h-coord, attribute, value picture_1.j
path, detect_id, score, x-coord, y-coord, w-coord, h-coord, attribute, value
picture_1.jpg,0,1.44855535,74,54,181,181,genderf,0.024716798
picture_1.jpg,0,1.44855535,74,54,181,181,genderm,0.975283206
我可以将此CSV转换为JSON,然后至少按路径/文件名将项目分组在一起
但这会留下很多冗余信息,我想把我的属性和它们的值放在一个嵌套对象中,在主对象中
比如:
Path: picture_1.jpg
Attributes: [genderf: 0.025,
genderm: 0.985]
other_info: other info
现在我使用lodash创建对象,如下图所示,但如果我尝试映射属性,我最终会推出除最后一个元素之外的所有元素
因此,我可以使用以下代码创建对象
var result =
_([...arr1, ...arr2])
.concat()
.groupBy("path")
.value();
其中,arr1和arr2是来自输出csv一行的数据。除属性及其值外,所有信息都相同
这让我得到了这个对象:
{
"picture_1.jpg": [
{
"path": "picture_1.jpg",
"detect_id,": "0",
"score,": "1.44855535",
"coordinates": [
{
"x,": "74",
"y,": "54",
"w": "181",
"h": "181"
}
],
"attribute": "genderf",
"value": "0.024716798"
},
{
"path": "picture_1.jpg",
"detect_id,": "0",
"score,": "1.44855535",
"coordinates": [
{
"x,": "74",
"y,": "54",
"w": "181",
"h": "181"
}
],
"attribute": "genderm",
"value": "0.975283206"
}
]
}
它至少根据路径标题将图片分组在一起,但许多信息是冗余的,这只是测量一个属性 您只需迭代所有
csv
-行,构建一个对象/映射
,同时跟踪已找到的文件名/路径。如果遇到路径已存在于地图中的行,只需附加属性/值
对即可。类似这样的内容(请注意,为了简单起见,我更改了coords分隔符,并且它需要正确的错误处理):
const data=[“picture_1.jpg,0,1.44855535,74;54;181;181,genderf,0.024716798”,“picture_1.jpg,0,1.44855535,74;54;181;181,genderm,0.975283206”];
函数createImageDataMap(dataArr){
常量imageDataResult={};
用于(数据阵列的常数imgData){
常数currData=parseImgDataLine(imgData);
如果(!imageDataResult[currData.path]){
imageDataResult[currData.path]={
属性:[],其他信息:{
分数:currData.score,
detectId:currData.detectId,
coords:currData.coords
}
}
}
imageDataResult[currData.path].attributes.push({[currData.attribute]:currData.value});
}
返回imageDataResult;
}
函数parseImgDataLine(行){
常量属性=line.split(',');
返回{
路径:属性[0],
detectId:属性[1],
分数:属性[2],
坐标:属性[3],
属性:属性[4],
值:属性[5]
}
}
log(JSON.stringify(createImageDataMap(data))哇,这真是太棒了。我可以使用它来处理更大的csv,但是我已经在数据常量中添加了一个不同的文件名和属性,我可以使用json对象并将其插入到我正在使用的数据库中。谢谢太好了!:)别忘了接受我的回答,谢谢!