Я понятия не имею, какой заголовок мог бы написать. Собственно, вот что я получаю от API:

[
    {
      "order": 1,
      "role": {
        "label": "singer"
      },
      "artist": {
        "name": "AaRON"
      }
    },
    {
      "order": 1,
      "role": {
        "label": "author"
      },
      "artist": {
        "name": "Simon Buret"
      }
    },
    {
      "order": 2,
      "role": {
        "label": "author"
      },
      "artist": {
        "name": "Olivier Coursier"
      }
    },
    {
      "order": 1,
      "role": {
        "label": "composer"
      },
      "artist": {
        "name": "John Doe"
      }
    }
  ]

И вот что мне нужно отправить:

"artist": {
  "singer": [
    "AaRON"
  ],
  "author": [
     "Simon Buret",
     "Olivier Coursier"
  ]
}

Конечно, необходимо учитывать свойство заказа.

Пример: Simon Buret - это первый элемент, потому что для него установлен порядок 1.

Я совершенно не знаю, как это реализовать, я только что сделал карту, но не знаю, что поместить внутрь: /

this.artistControl.controls.map(artistControl => {
   ...
});

Есть ли способ сделать то, что мне нужно?

0
Emilien 21 Авг 2020 в 11:47

4 ответа

Лучший ответ

Работает ли это для вас:

let arr = [
    { "order": 1, "role": { "label": "singer" }, "artist": { "name": "AaRON" } },
    { "order": 1, "role": { "label": "author" }, "artist": { "name": "Simon Buret" } },
    { "order": 2, "role": { "label": "author" }, "artist": { "name": "Olivier Coursier" } },
    { "order": 1, "role": { "label": "composer" }, "artist": { "name": "John Doe" } }
];

let obj = {'artist': {}};
arr.forEach(a => {
    obj['artist'][a.role.label] = obj['artist'][a.role.label] || [];
    obj['artist'][a.role.label][a.order-1] = a.artist.name;
});

console.log(obj);
1
Rahul Bhobe 21 Авг 2020 в 09:01
const array = [{"order":1,"role":{"label":"singer"},"artist":{"name":"AaRON"}},{"order":1,"role":{"label":"author"},"artist":{"name":"Simon Buret"}},{"order":2,"role":{"label":"author"},"artist":{"name":"Olivier Coursier"}},{"order":1,"role":{"label":"composer"},"artist":{"name":"John Doe"}}];

const result = array
  .sort((item1, item2) => item1.order - item2.order)
  .reduce((acc, { role, artist }) => ({
    ...acc,
    artist: {
      ...acc.artist,
      [role.label]: [
        ...(acc.artist[role.label] || []),
        artist.name,
      ],
    },
  }), { artist: {} });
  
console.log(result);
1
Mehran Hatami 21 Авг 2020 в 09:15

Вот еще один подход с es5

const data = [{ "order": 1, "role": { "label": "singer" }, "artist": { "name": "AaRON" } }, { "order": 1, "role": { "label": "author" }, "artist": { "name": "Simon Buret" } }, { "order": 2, "role": { "label": "author" }, "artist": { "name": "Olivier Coursier" } }, { "order": 1, "role": { "label": "composer" }, "artist": { "name": "John Doe" } }];

 var result = data.reduce(function(map, obj) {
            map["artist"] = map["artist"] || {};
            if (obj.role.label === 'author' || obj.role.label === 'singer') {
                map["artist"][obj.role.label] = map["artist"][obj.role.label] || [];
                map["artist"][obj.role.label][obj.order - 1] = obj.artist.name;
            }
            return map;
 }, {});
        
 console.log(result)
0
Navoneel Talukdar 21 Авг 2020 в 10:45

Вы можете использовать метод reduce с объектом в качестве параметра аккумулятора, а затем проверить, не существует ли ключ, создать его с пустым массивом в качестве значения, а затем добавить имена по порядку.

const data = [{"order":1,"role":{"label":"singer"},"artist":{"name":"AaRON"}},{"order":1,"role":{"label":"author"},"artist":{"name":"Simon Buret"}},{"order":2,"role":{"label":"author"},"artist":{"name":"Olivier Coursier"}},{"order":1,"role":{"label":"composer"},"artist":{"name":"John Doe"}}]

const result = data.reduce((r, {
  role: { label },
  artist: { name },
  order
}) => {
  if (name) {
    if (!r[label]) r[label] = [];
    r[label][order - 1] = name;
  }
  
  return r;
}, {})

console.log(result)
1
Nenad Vracar 21 Авг 2020 в 09:03