как изменить объект в javascript - PullRequest
1 голос
/ 01 августа 2020

У меня есть этот объект

 users : [
  {
    _id: "5",
    name: "tomek"
  },
  {
    _id: "6",
    name: "janek"
  },
  {
    _id: "7",
    name: "Jakub"
  },
    {
    _id: "8",
    name: "Piotr"
  }
],
 groups : [
  {
    users: ["5", "6"],
    _id: "22",
    name: "group 1"
  },
    {
    users: ["7"],
    _id: "33",
    name: "group 2"
  }
] 
}

, и я хотел бы его изменить, чтобы он выглядел так

group:[{name:'group 1',user:[{objects with users belonging to the first group },{...},{...}]}, {name:'group 2',users:[{obj with users belonging to the first group},{...}]},{name:'no group'
,users:[{
objects with users not belonging to any group}]}
} 

на основе указанного выше объекта, я бы хотел сделать один , Пользователи без группы должны быть помещены в группу: 'NO GROUP ",

Ответы [ 3 ]

1 голос
/ 01 августа 2020

Используйте функции массива ES6 map / reduce / filter / find, например:

// Your input
const input={users:[{_id:"5",name:"tomek"},{_id:"6",name:"janek"},{_id:"7",name:"Jakub"},{_id:"8",name:"Piotr"}],groups:[{users:["5","6"],_id:"22",name:"group 1"},{users:["7"],_id:"33",name:"group 2"}]};

// List all users in a group
const usersInGroup = input.groups.reduce((acc, g) => [...acc, ...g.users], []);

// Final "groups" Array  
const groups = [
    ...input.groups.map(g => ({
        name: g.name,
        users: g.users.map((user) => input.users.find(u => u._id === user))
    })),
    {
      name: 'NO GROUP',
      users: input.users.filter(u => !usersInGroup.includes(u._id))
    }
];

// Display groups
console.log(JSON.stringify(groups, null, ' '));
1 голос
/ 01 августа 2020

Вы можете сделать это с помощью нескольких итераций (карта, фильтр и т. Д. c.) И создать новый объект или массив. Поиграйте с этим немного.

const data = {
  users: [
    {
      _id: '5',
      name: 'tomek',
    },
    {
      _id: '6',
      name: 'janek',
    },
    {
      _id: '7',
      name: 'Jakub',
    },
    {
      _id: '8',
      name: 'Piotr',
    },
  ],
  groups: [
    {
      users: ['5', '6'],
      _id: '22',
      name: 'group 1',
    },
    {
      users: ['7'],
      _id: '33',
      name: 'group 2',
    },
  ],
};

// Pack all groups and users together in "one" command
const result = [
  // spread operator to spread the groups
  ...data.groups.map((group) => ({
    // spread the group properties, you can also specify them individually
    ...group,
    // find users with id
    users: group.users.map((id) => data.users.find((user) => id === user._id)),
  })),
  // add a special group
  {
    name: 'NO_GROUP',
    // filter the users
    users: data.users.filter(
      (user) =>
        // check if user is not part of a group
        !data.groups
          .map((group) => group.users)
          // flat() turns [["5", "6"], ["7"]] into ["5", "6", "7"]
          .flat()
          .includes(user._id)
    ),
  },
];

console.log(result);
0 голосов
/ 01 августа 2020

Еще немного старой школы ...

<script>

var people = { users : [
  {
    _id: "5",
    name: "tomek"
  },
  {
    _id: "6",
    name: "janek"
  },
  {
    _id: "7",
    name: "Jakub"
  },
    {
    _id: "8",
    name: "Piotr"
  }
],
 groups : [
  {
    users: ["5", "6", "12"],
    _id: "22",
    name: "group 1"
  },
    {
    users: ["7"],
    _id: "33",
    name: "group 2"
  }
] 
}


var newgroups = []
var notfoundusers = []

for (var g=0; g<people.groups.length; g++)
{
  var users = []

  for (var u=0; u<people.groups[g].users.length; u++)
  {

   var p = people.users.find( x => x._id == people.groups[g].users[u] )
   if ( p != undefined )
   {
     users.push(p);
   }
   else
   {
     notfoundusers.push( { group: people.groups[g].name, user: people.groups[g].users[u] } );
   }
  }

  var group = { name: people.groups[g].name, user: users}
  newgroups.push(group);

}

var notfoundgroup = { name: "no group", user: notfoundusers}
newgroups.push(notfoundgroup)

console.log(JSON.stringify(newgroups))


</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...