首页 > 解决方案 > 如何根据对象值将对象数组转换为对象数组?

问题描述

我有一个这样的对象数组:

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 尝试了几件事,但我所做的最好的是将对象数组转换为数组数组......但没有我需要的分组。

标签: javascriptarrays

解决方案


我们可以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));


推荐阅读