3

問題があります。以下のように年齢 (キーとして) の子供の数を数えようとしていますが、子供に基づいて bigkids グループ (この場合は 4 と 2) を取得したいと考えています >= 4 キッズグループ BigKids グループを作れる年齢の最大数を取得したいです。

質問 新しく作成されたグループの年齢のうち、最大の年齢が 4 歳未満または 4 歳の子供と同じであるグループの年齢を取得するにはどうすればよいですか?

入力で得られるものは次のとおりです

max_bigest_kids_in_group = 4
kids object = {
//age 0 have 7 kids
'0' : 7
//age 1 have 3 kids
'1' : 3
//age 2 have 2 kids
'2' : 2 
//age 4 have 1 kids
'4' : 1
//lets say there is no age 3 or 5,6 and so on.
}

私が試して、現在これまでに作成したものは、現在psudoにあります

try    biggest  next biggest 
    ('4' = 1) + ('2' = 2)  (oke becouse 1+2 is 3 >= 4) save array [4 and 2]
try    biggest  next biggest next biggest
    ('4' = 1) + ('2' = 2) + ('1' = 3) (not oke becouse 1+2+3 is 6 >= 4) stop becouse its more then x = 4
    get array [4 and 2] 

    // expected result is {'4','2'} or ['4','2'] so if max_bigest_kids_in_group = 6 then it will be ['4','2','1']

どうすればその期待される結果を得ることができますか? JavaScriptで

ps。タイトルが正確でない場合は申し訳ありませんが、提案があればコメントまたは編集してください。

4

3 に答える 3

2

あなたのオブジェクトkidsはデフォルトではソートされていないと思います。また、JS では、 for…inループがプロパティを返す順序に依存することはできません(詳細については、リンクを参照してください)。したがって、最初のステップは、オブジェクトをソート可能な構造に変換し、取得した順序が正しいことを確認することです。

kids  = {
    //age 0 have 7 kids
    '0' : 7,
    //age 1 have 3 kids
    '1' : 3,
    //age 2 have 2 kids
    '2' : 2,
    //age 4 have 1 kids
    '4' : 1
    //lets say there is no age 3 or 5,6 and so on.
}

var array = [];

for (var age in kids) {
    if (kids.hasOwnProperty(age)) {
        array.push({age: age, count: kids[age]});
    }
}

取得したら、次のように配列をソートできます。

array.sort(function(a, b) { return a.count - b.count });

そして、計算を行うことができます:

var maxKids = 4;
var groups = [];
var count = 0;

for (var i = 0; i < array.length; i++) {
    count += array[i].count;

    if (count <= maxKids)
        groups.push(array[i].age);
    else
        break;
}

console.log(groups);

このアプローチは、子供のすべてのグループが持つことができる子供の最大数を超えた場合にも対応するため、空の配列が取得されます。

于 2012-07-10T18:32:42.970 に答える
2

それは簡単です。疑似コードのように、子供たちをループするだけです。

var kids = {
   '0' : 7, //age 0 have 7 kids
   '1' : 3, //age 1 have 3 kids
   '2' : 2, //age 2 have 2 kids
   '4' : 1  //age 4 have 1 kids
};
function getAgesOfOldestKids(n) {
/* get: {number} how many kids */

    // lets begin with some magic to find out the maximum age in the set
    // you might code this with a for-in-loop over kids
    var max = Math.max.apply(null, Object.keys(kids));

    var ages = []; // ages of the kids in the result
    var count = 0; // how many kids are in the set
    for (var i=max; i>=0; i--)
        if (i in kids) { // age level exists
            count += kids[i]; // add number of kids
            if (count > n) // kids in the set are more than allowed
                return ages; // break the loop
            else
                ages.push(i); // add this age step to the result
        }
    return ages; // there may be less children than requested
}

> getAgesOfOldestKids(4)
["4", "2"]

// a trick to get the number of kids in the result:
> var ages = [4, 2];
> ages.reduce(function(n, age){return n+kids[age]}, 0)
3

子供のキーを直接ループする、他の可能性のあるはるかに短いソリューション:

function getAgesOfOldestKids(n) {
/* get: {number} how many kids */

    // ages, sorted descending
    var ages = Object.keys(kids).sort(function(a,b){return b-a;});

    var count = 0; // how many kids are in the set
    for (var i=0; i<ages.length-1 && count <= n; i++)
        count += kids[ages[i]]; // add number of kids
    return ages.slice(0, i-1);
}
于 2012-07-10T17:47:10.467 に答える
0

問題を完全にフォローしているかどうかはわかりませんが、これらの線に沿ったものですか?

http://jsfiddle.net/kyuff/Tkj2r/7/

var kids = {
//age 0 have 7 kids
    0 : 7,
//age 1 have 3 kids
    1 : 3,
//age 2 have 2 kids
    2 : 2,
//age 4 have 1 kids
    4 : 1
    };
function between(min, max) {
    var age = 0;
    for(var age in kids) {
        if( age >= min && age <= max) {
            age += kids[age];
        }
    }
    return age;
}


document.write( between(2,3) );
于 2012-07-10T13:35:35.957 に答える