javascript - 如何根据对象值将对象数组转换为对象数组?
问题描述
我有一个这样的对象数组:
const arrayOfObjects = [
{app: 'User', subpage: 'Dashboard', path: '/user/dashboard'},
{app: 'User', subpage: 'Profile', path: '/user/profile'},
{app: 'User', subpage: 'Settings', path: '/user/settings'},
{app: 'Library', subpage: 'Dashboard', path: '/library/dashboard'},
{app: 'Library', subpage: 'Settings', path: '/library/settings'},
{app: 'Material', subpage: 'Dashboard', path: '/material/dashboard'}]
我想要一个数组数组......其中每个“子数组”都是来自 arrayOfObjects 的原始对象数组,仅基于应用程序属性(用户、库、材料)分离。因此,新数组应如下所示:
newArray = [
[{app: 'User', subpage: 'Dashboard', path: '/user/dashboard'},
{app: 'User', subpage: 'Profile', path: '/user/profile'},
{app: 'User', subpage: 'Settings', path: '/user/settings'}],
[{app: 'Library', subpage: 'Dashboard', path: '/library/dashboard'},
{app: 'Library', subpage: 'Settings', path: '/library/settings'}],
[{app: 'Material', subpage: 'Dashboard', path: '/material/dashboard'}]
]
我已经用 .map 和 .forEach 尝试了几件事,但我所做的最好的是将对象数组转换为数组数组......但没有我需要的分组。
解决方案
我们可以Array.find
用来检查是否已经有一个具有相同值的元素app
。如果是这样,我们可以添加到该数组中。如果没有,请创建一个新数组。
const arrayOfObjects = [
{app: 'User', subpage: 'Dashboard', path: '/user/dashboard'},
{app: 'User', subpage: 'Profile', path: '/user/profile'},
{app: 'User', subpage: 'Settings', path: '/user/settings'},
{app: 'Library', subpage: 'Dashboard', path: '/library/dashboard'},
{app: 'Library', subpage: 'Settings', path: '/library/settings'},
{app: 'Material', subpage: 'Dashboard', path: '/material/dashboard'}]
const newArray = []
arrayOfObjects.forEach(x => {
const existing = newArray.find(y => y[0].app == x.app);
if (existing) {
existing.push(x);
}
else {
newArray.push([x]);
}
});
document.write(JSON.stringify(newArray))
或者,使用Array.reduce
const arrayOfObjects = [
{app: 'User', subpage: 'Dashboard', path: '/user/dashboard'},
{app: 'User', subpage: 'Profile', path: '/user/profile'},
{app: 'User', subpage: 'Settings', path: '/user/settings'},
{app: 'Library', subpage: 'Dashboard', path: '/library/dashboard'},
{app: 'Library', subpage: 'Settings', path: '/library/settings'},
{app: 'Material', subpage: 'Dashboard', path: '/material/dashboard'}]
const newArray = arrayOfObjects.reduce((a,b) => {
const existing = a.find(x => x[0].app == b.app);
if (existing) {
existing.push(b);
}
else {
a.push([b]);
}
return a;
}, []);
document.write(JSON.stringify(newArray));
推荐阅读
- vba - 在 Word VBA 上用 StoryRange 替换文本使其短暂无响应
- unicode - FontLab 字形名称到 Unicode 映射不起作用
- java - 如何将 JavaFX 图表包含到现有的 GUI 中?
- mysql - MYSQL 使用 FCFS 从多行中减去一条记录
- javascript - 从 Web 将 HTML5 视频下载到 IOS 相机胶卷
- sql - 如何计算 SQL 中两个不同列的 id
- javascript - 如何将单个字符串转换为对象
- python - 在熊猫数据框的两列中找到相等的值
- python-3.x - 在 python3 的 numpy.txt 中打开 csv 文件
- c++ - 带有自定义键的 std::unordered 映射在 ~ 31,000 个元素处失败