node.js - 在NodeJS中按另一个数组的项对数组进行分组
问题描述
我在 NodeJS 中有 2 个数组:
var dataCms = ["BIG BIKE","CUB","MATIC","SPORT"];
var outJSON = [
{
"id": "42513b49-9bd8-11e9-a417-560001ead144",
"series": "GENIO",
"cms": "MATIC"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "VARIO",
"cms": "MATIC"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "BEAT",
"cms": "MATIC"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "SUPRA",
"cms": "CUB"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "SONIC",
"cms": "SPORT"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "REVO",
"cms": "CUB"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a8900",
"series": "GENIO",
"cms": "MATIC"
}
];
我想通过数组 dataCms 对数组 outJSON 进行分组,如下所示:
{
"BIGBIKE":[],
"CUB": [
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "SUPRA"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "REVO"
}
],
"MATIC": [
{
"id": "42513b49-9bd8-11e9-a417-560001ead144",
"series": "GENIO"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "VARIO"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "BEAT"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a8900",
"series": "GENIO"
}
],
"SPORT": [
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "SONIC"
}
]
}
我试过这样:
let groups = Object.create(null);
outJSON.forEach(item => {
if (!groups[item.cms]) {
groups[item.cms] = [];
}
groups[item.cms].push({
id: item.id,
series: item.series
});
});
let result =
Object.entries(groups)
.map(([k, v]) => ({[k] : v}));
console.log(result);
return res.json(groups);
但我得到的结果是这样的:
{
"MATIC": [
{
"id": "42513b49-9bd8-11e9-a417-560001ead144",
"series": "GENIO"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "VARIO"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "BEAT"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a8900",
"series": "GENIO"
}
],
"CUB": [
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "SUPRA"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "REVO"
}
],
"SPORT": [
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "SONIC"
}
]
}
我想要 dataCms 中的项目是否在 outJson 中没有相同的项目仍然显示但长度为 0。
解决方案
您应该遍历这些值dataCms
以确保它们都作为键出现在您的输出中。outJSON
然后您可以根据值过滤cms
值并创建一个对象,该对象是outJSON
没有cms
键的值以推入结果数组:
var dataCms = ["BIG BIKE", "CUB", "MATIC", "SPORT"];
var outJSON = [{
"id": "42513b49-9bd8-11e9-a417-560001ead144",
"series": "GENIO",
"cms": "MATIC"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "VARIO",
"cms": "MATIC"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "BEAT",
"cms": "MATIC"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "SUPRA",
"cms": "CUB"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "SONIC",
"cms": "SPORT"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a3cf4",
"series": "REVO",
"cms": "CUB"
},
{
"id": "5d8ae0f0-cda0-4c1d-be01-1bfd422a8900",
"series": "GENIO",
"cms": "MATIC"
}
];
groups = dataCms.map(c => ({
[c]: outJSON.filter(v => v.cms == c)
.map(o => ({
id: o.id,
series: o.series
}))
}));
console.log(groups);
推荐阅读
- c# - Windows 窗体应用程序通过代理 Internet 访问 google firestore。我怎样才能做到这一点?
- javascript - 如何检查获取响应以调用另一个响应?
- c# - 从列表中选择组
匹配不能直接在属性上指定的条件 - javascript - 如何将 JSON 转换为 GeoJson 以用于 Google Maps API v3
- c++ - 在 Visual Studio 2017 C++ 项目中设置调试/运行环境变量?
- eclipse - Eclipse:将工作区从 svn 切换到 git(代码已迁移)
- python - 无法使用python发送发布请求
- python - 使用 MinMaxScaler 转换测试集时会发生什么
- apache - 升级后的 Apache 重写条件
- javascript - 在单击第二个按钮之前,AngularJS 数据不会刷新