-1

スコアに応じて、一定の金額を人々の配列に分配する必要があります。ルールは、彼らの要求は彼らの立場に応じて、残っているもので満たされるということです. ローダッシュ ( JSBin ) を使用する JavaScript の場合:

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}]

解決策は順序に依存するため、このコードを純粋に機能するように変更することは可能ですか?

4

1 に答える 1

0

機能的な解決策は折り畳みです:

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;
}
于 2014-07-27T10:07:01.067 に答える