Как создать массив в объекте после его фильтрации и отображения? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть объект и есть некоторые сходства с типом и идентификатором. Если тип и идентификатор совпадают, я хотел бы изменить содержимое в массив и сохранить там все соответствующее содержимое.

Кажется, я не могу обернуть голову вокруг объектов и сопоставления. Любая помощь будет принята с благодарностью. Спасибо.

[{
type: 'movs',
id: '1001',
content: '111'
},
{
type: 'books',
id: '1001',
content: '222'
},
{
type: 'books',
id: '1001',
content: '333'
},
{
type: 'books',
id: '1002',
content: '444'
},
{
type: 'movs',
id: '1001',
content: '112'
},
{
type: 'movs',
id: '1005',
content: '113'
}]

стать

[{
type: 'movs',
id: '1001',
content: ['111', '112']
},
{
type: 'movs',
id: '1005',
content: ['113']
},
{
type: 'books',
id: '1001',
content: ['222', '333']
},
{
type: 'books',
id: '1002',
content: ['444']
}]

Отредактировано: цитаты

1 Ответ

1 голос
/ 23 октября 2019

Как только вы исправите недействительные кавычки, вы просто используете reduce:

const arr = [{type:"movs",id:"1001",content:"111"},{type:"books",id:"1001",content:"222"},{type:"books",id:"1001",content:"333"},{type:"books",id:"1002",content:"444"},{type:"movs",id:"1001",content:"112"},{type:"movs",id:"1005",content:"113"}];

const res = Object.values(arr.reduce((a, { type, content, id }) => (a[`${type}_${id}`] = (a[`${type}_${id}`] || { type, id, content: [] }), a[`${type}_${id}`].content.push(content), a), {}));

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

Более подробная / понятная версия:

const arr = [{type:"movs",id:"1001",content:"111"},{type:"books",id:"1001",content:"222"},{type:"books",id:"1001",content:"333"},{type:"books",id:"1002",content:"444"},{type:"movs",id:"1001",content:"112"},{type:"movs",id:"1005",content:"113"}];

const res = arr.reduce((accumulator, currentItem) => {
  let { type, id, content } = currentItem;
  let uniqueIdentifier = `${type}_${id}`; 
// { type, id, content: [] }), a[`${type}_${id}`].content.push(content), a), {}));
  if (accumulator[uniqueIdentifier]) {
    accumulator[uniqueIdentifier].content.push(content);
  }
  else {
    accumulator[uniqueIdentifier] = { type, id, content: [content] };
  }
  return accumulator;
}, {});

const resultArr = Object.values(res);

console.log(resultArr);
.as-console-wrapper { max-height: 100% !important; top: auto; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...