Публикую решение как я сделал. Я реальный шанс разделил на 100 и тогда получается то что нужно.
const gift = [
{ name : "Ручка", price : 12 },
{ name : "Телефон", price : 2222 },
{ name : "Блокнот", price : 33 },
{name : "Альбом",price : 120 },
{name : "Книга", price : 333 },
];
let allSum = gift.reduce((a, b) => a + (b["price"] || 0), 0);
console.log(allSum);
gift.sort((a, b) => b.price - a.price );
gift.forEach((e, i) => {
gift[i].bigChance = (100/(100 / (allSum / e.price)));
});
let allChance = gift.reduce((a, b) => a + (b["bigChance"] || 0),0);
gift.forEach((e, i) => {
gift[i].chance = ( 100 / (allChance / e.bigChance)).toFixed(4);
});
console.log(gift)
Результат
[
{"name":"Телефон","price":2222,"bigChance":1.2241224122412242,"chance":"0.3588"},
{"name":"Книга","price":333,"bigChance":8.168168168168169,"chance":"2.3943"},
{"name":"Альбом","price":120,"bigChance":22.666666666666668,"chance":"6.6442"},
{"name":"Блокнот","price":33,"bigChance":82.42424242424242,"chance":"24.1607"},
{"name":"Ручка","price":12,"bigChance":226.66666666666666,"chance":"66.4420"}
]