如何在纯功能风格中分配数量

How to ration amount in purely functional style

本文关键字:分配 风格 功能      更新时间:2023-09-26

我需要根据一组人的分数分配一定的金额。规则是,根据他们的立场,用剩下的任何东西满足他们的要求。在JavaScript中使用Lo-Dash (JSBin):

var amount = 1000,
  people = [
    { name : 'Joe', score: 40, demand: 400},
    { name : 'Sue', score: 30, demand: 350},
    { name : 'Kim', score: 25, demand: 300},
    { name : 'Ron', score: 20, demand: 250}
  ];
function  distribute(people, amount){
   return _.map(_.sortBy(people,'need'),function(person){      
     var ration = Math.min(person.demand,amount); 
     amount -= ration; // This is the state (mutation) that I want to avoid
     return _.assign(person,{ ration: ration})
 });
}
console.log(distribute(people, amount));
结果:

[{  demand: 400,  name: "Joe",  ration: 400,  score: 40}, 
 {  demand: 350,  name: "Sue",  ration: 350,  score: 30}, 
 {  demand: 300,  name: "Kim",  ration: 250,  score: 25}, 
 {  demand: 250,  name: "Ron",  ration:   0,  score: 20}]

由于解决方案取决于顺序,是否有可能更改此代码以使其纯功能?

功能解决方案是折叠:

function distribute(people, amount) {
  return _.foldl(_.sortBy(people, 'score'), function(result, person) {
    var ration = Math.min(person.demand, result.remaining);
    var resultPerson = _.assign(person, { ration: ration });
    return { people: result.people.concat(resultPerson),
             remaining: result.remaining - ration };
  }, { people: [], remaining: amount }).people;
}