javascript - 如何对数组键值进行分组
问题描述
我收到如下 API 响应
[{id: 1, fileName:"abc.png",docid:"123",controlNumb:"11"},
{id:2,fileName:"mno.png",docid:"121",controlNumb:"12"},
{id:1,fileName:"def.png",docid:"120",controlNumb:"11"},
{id:3,fileName:"xyz.png",docid:"125",controlNumb:"13"},
{id:2,fileName:"rst.png", docid:"126",controlNumb:"12"}]
我想转换成什么
[{id: 1, fileName:["abc.png",def.png],docid:["123","120"],controlNumb:"11"},
{id: 2, fileName:["mno.png",rst.png],docid:["121","126"],controlNumb:"12"}
{id: 3, fileName:["xyz.png"],docid:["125"],controlNumb:"11"}
我尝试了 .reduce 方法,它给出了相同的输出,但 fileName 和 type 显示的对象我不能使用映射到这些键。
如果 id 为空,我想按 controlNumb 分组
下面的代码,我试过
let newDirectory = Object.values(
this.state.data.reduce((acc, item) => {
if (!acc[item.id])
acc[item.id] = {
id: item.id,
controlNumb: item.controlNumb,
docid: [],
fileName: [],
};
acc[item.id].docid.push(item.docid);
acc[item.id].fileName.push(item.fileName);
return acc;
}, {})
);
console.log("newDirectory", newDirectory);
上面的代码返回数组,但它的对象类型,所以我不能在文件名中使用 map
解决方案
U 可以遍历数据,并根据相同的值对值进行分组,然后将和id
的属性扩展为,例如:fileName
docid
arrays
const data = [{ id: 1, fileName: "abc.png", docid: "123", controlNumb: "11" },
{ id: 2, fileName: "mno.png", docid: "121", controlNumb: "12" },
{ id: 1, fileName: "def.png", docid: "120", controlNumb: "11" },
{ id: 3, fileName: "xyz.png", docid: "125", controlNumb: "13" },
{ id: 2, fileName: "rst.png", docid: "126", controlNumb: "12" }];
const parsedData = [];
for (const item of data) {
const index = parsedData.findIndex(storedItem => storedItem.id === item.id);
if (index === -1) {
const newItem = { ...item, fileName: [item.fileName], docid: [item.docid] }
parsedData.push(newItem);
}
else {
parsedData[index].fileName.push(item.fileName);
parsedData[index].docid.push(item.docid);
}
}
console.log(parsedData);
推荐阅读
- sparql - 使用 SPARQL 获取 RDF 图中两个节点之间的所有路径
- postgresql - 分区数据的 Postgres 性能问题
- python - 熊猫数据框中奇怪地缺少一个索引
- python - 生成元素小于或等于给定列表的列表
- extjs - 单击保存按钮以存储 ExtJS 网格记录时缺少记录
- node.js - Nodejs和React之间常用redux的store
- python - 在不同的服务器上运行 Django 命令
- redux - 运行并行传奇效果而不取消其中任何一个
- installation - ${NSD_GetText} 返回一个 Empty.string - 我卡住了
- docker - Freeboard 的 Orion 数据源和 Context Broker 之间没有连接