1

私はJSをもっとよく学ぼうとしています。

以下のコードをunderscore.jsに入れようとしていますが、失敗しています。

私がどこで間違っているのかを指摘していただければ幸いです。

私は、うまくいくことがわかっているループを取り、アンダースコア機能を使用してそれを洗練しようとしています。上のテストはループを示しています。2番目のテストはunderscore.jsで同じことをしようとしたものです。私は惨めに失敗しています!

ありがとう

 products = [
       { name: "Sonoma", ingredients: ["artichoke", "sundried tomatoes", "mushrooms"], containsNuts: false },
       { name: "Pizza Primavera", ingredients: ["roma", "sundried tomatoes", "goats cheese", "rosemary"], containsNuts: false },
       { name: "South Of The Border", ingredients: ["black beans", "jalapenos", "mushrooms"], containsNuts: false },
       { name: "Blue Moon", ingredients: ["blue cheese", "garlic", "walnuts"], containsNuts: true },
       { name: "Taste Of Athens", ingredients: ["spinach", "kalamata olives", "sesame seeds"], containsNuts: true }
    ];


it("should count the ingredient occurrence (imperative)", function () {
    var ingredientCount = { "{ingredient name}": 0 };

    for (i = 0; i < products.length; i+=1) {
        for (j = 0; j < products[i].ingredients.length; j+=1) {
            ingredientCount[products[i].ingredients[j]] = (ingredientCount[products[i].ingredients[j]] || 0) + 1;
        }
    }

    expect(ingredientCount['mushrooms']).toBe(2);
  });

  it("should count the ingredient occurrence (functional)", function () {
    var ingredientCount = { "{ingredient name}": 0 };


    var ffd = _(products).chain()
              .map(function(x){return x.ingredients;})
              .flatten()
              .reduce(function(memo,x){
                if (x===memo) 
                  {
                    return ingredientCount[memo] = ingredientCount[memo]+1;
                  }
                  else
                  {
                    return ingredientCount[memo] = 0;
                  }

                  })
              .value();

        /* chain() together map(), flatten() and reduce() */

    expect(ingredientCount['mushrooms']).toBe(2);
  });
4

2 に答える 2

3

あなたのreduceはあまり機能的ではありません。そのドキュメントを見てください!「アキュムレータ」とも呼ばれる「メモ」は、前の反復から返された値です。これがマップである必要がありますingredientCount

var ingredientCount = _.chain(products)
  .pluck("ingredients") // don't use map for that
  .flatten()
  .reduce(function (memo, item) {
       memo[item] = (memo[item] || 0)+1;
       /* alternative:
       if (item in memo)
           memo[item]++;
       else
           memo[item] = 1;
       */
       return memo; // to be used in the next iteration!
  }, {/*"{ingredient name}": 0*/})
  .value();

注意してmemo === ingredientCountください!

于 2013-01-15T17:06:58.970 に答える
0

機能的ではありませんが、コードを理解するためにもっと簡単に使用します。

it("should count the ingredient occurrence (functional)", function () {

  var ingredientCount = { "{ingredient name}": 0 };

  var dummy = _(products).chain()
     .pluck("ingredients")
     .flatten()
     .each(function(x) { ingredientCount[x] = (ingredientCount[x] || 0) + 1; })
     .value();

  expect(ingredientCount['mushrooms']).toBe(2);
});
于 2013-12-10T05:13:06.227 に答える