Javascript объединить и составить объекты с одинаковым идентификатором - PullRequest
0 голосов
/ 11 марта 2019

Я пытался объединить данные и получить такой результат:

data = [{serviceID: 22, quantite: 120, typeConviveId: 6},
       {serviceID: 23, quantite: 240, typeConviveId: 6},
        {serviceID: 24, quantite: 100, typeConviveId: 7},
        {serviceID: 25, quantite: 150, typeConviveId: 7}]  

что нужно в конце:

result: [ { "22": "120", "23": "240", "typeConviveId": "6"},
        { "24": "100", "25": "150", "typeConviveId": "7" } ] 

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Вы можете использовать комбинацию Array.prototype.map, Array.prototype.filter и Array.prototype.reduce вместе со списком уникальных typeConviveId, дедуплированных с помощью Set с [...new Set(data.map(x=>x.typeConviveId))]:

const data = [{serviceID: 22, quantite: 120, typeConviveId: 6}, {serviceID: 23, quantite: 240, typeConviveId: 6}, {serviceID: 24, quantite: 100, typeConviveId: 7}, {serviceID: 25, quantite: 150, typeConviveId: 7}];

const result = [...new Set(data.map(x => x.typeConviveId))].map(
  id => data
  .filter(x => x.typeConviveId === id)
  .reduce((acc, val) => {
    return { ...acc,
      [val.serviceID]: '' + val.quantite
    }
  }, {
    typeConviveId: '' + id
  })
);

console.log(result);
0 голосов
/ 11 марта 2019

Вы можете использовать массив reduce, а в функции обратного вызова используйте findIndex, чтобы получить объект с таким же typeConviveId. findIndex вернет индекс объекта, который имеет тот же findIndex из массива аккумулятора, который представлен acc. В fiindIndex равно -1, затем создайте новый объект с необходимыми ключами и вставьте его в массив аккумуляторов. Если уже существует массив с таким же typeConviveId, просто обновите объект новым ключом

let data = [{
    serviceID: 22,
    quantite: 120,
    typeConviveId: 6
  },
  {
    serviceID: 23,
    quantite: 240,
    typeConviveId: 6
  },
  {
    serviceID: 24,
    quantite: 100,
    typeConviveId: 7
  },
  {
    serviceID: 25,
    quantite: 150,
    typeConviveId: 7
  },
  {
    serviceID: 25,
    quantite: 250,
    typeConviveId: 7
  }
]


let newData = data.reduce(function(acc, curr) {
  let findIndex = acc.findIndex(function(item) {
    return item.typeConviveId === curr.typeConviveId;
  })
  if (findIndex === -1) {
    acc.push({
      typeConviveId: curr.typeConviveId,
      [curr.serviceID]: curr.quantite

    })

  } else {
    acc[findIndex][curr.serviceID] = curr.quantite

  }



  return acc;


}, []);

console.log(newData)

У ожидаемого результата есть проблема. Например, если есть дубликат ключа, предположим, что если ключ, такой как 22, повторен, то он будет иметь последнее значение.

{
        serviceID: 25,
        quantite: 150,
        typeConviveId: 7
      },
      {
        serviceID: 25,
        quantite: 250,
        typeConviveId: 7
      }

В этом случае serviceID в обоих объектах равно 25, поэтому его значение будет 250. У него не будет двух ключей с отдельным значением

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