Вы можете использовать массив 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. У него не будет двух ключей с отдельным значением