2017-07-02 5 views
0
getEmployeeCredits(id) { 
     if (this.state.company_roles) { 
      return this.state.company_roles.map(function (cr, i) { 
       if (cr.id === id) { 
        return cr.assigned_credits 
       } 
      }.bind(this)); 
     } 
    } 

ここで値が一致する会社のロールの割り当てクレジットを返信したいと思います。しかし返される値は[undefined, undefined, undefined, "10000.0"]です。リストキーからの反応抽出値

これは、値が一致しなかった会社のロールのために定義されていない値です。 undefinedの値をすべて削除して、値10000.0を使用するだけですが、これを行うにはよりエレガントな方法がありますか?

EDIT:THE if (cr.id === id)条件は常に単一の値に対して真です。

答えて

1

アレイを単一の値で検索する場合は、Array.prototype.findを使用します。あなたの例に調整

const foundCompanyRoleItem = this.state.company_roles.find(crItem => crItem.id === id); return foundCompanyRoleItem.assigned_credits;

これは常に.filterの場合のように配列の代わりに一致する値を返します。

P .:プロジェクトにもES6構文を使用することをお勧めします。上の例では、私の例がES6で導入された矢印関数を使用しているので、利点を見ることができます。表現がより洗練され、より合理的になります。

+0

これは私が欲しいものを達成する最もクリーンな方法のようです。ありがとう – anonn023432

+0

私のプロジェクトにはES6の構文を使用しています。それはより清潔に見える – anonn023432

1

EDITは:ちょうどあなたが配列を取得する場合

return this.state.company_roles.filter(function (cr, i) { 
       if (cr.id === id) { 
        if(cr.assigned_credits!=undefined) 
         return cr.assigned_credits; 
        else 
         return false; 
       } 

、あなたが使用して未定義の値を削除することができます...しようとArray.prototype.filter

例:

var data = [42, 21, undefined, 50, 40, undefined, 9]; 

data = data.filter(function(element) { 
    return element !== undefined; 
}); 
+0

これは本当ですが、返された 'cr.assigned_credits'から未定義の値を取り除くことができます。 if条件がtrueのときに 'assigned_credits'の値だけを返す方法があるのか​​どうか疑問に思っていました。そして、配列の代わりに単一の値を返します。 – anonn023432

+0

確かに!私が試してみましょう。 –

+0

これも仕事です、おかげです。 – anonn023432

0

あなたがしない理由company_rolesに直接filterを使用しますか?

getEmployeeCredits(id) { 
    if (this.state.company_roles) { 
    return this.state.company_roles.filter(cr => cr.id === id); 
    } 
} 
0

これは、if文が1つの値に対して真であり、残りが暗黙的に未定義に戻っているためです。

getEmployeeCredits(id) { 
      if (this.state.company_roles) { 
       return this.state.company_roles.map(function (cr, i) { 
        if (cr.id === id) { 
         return cr.assigned_credits 
        } 
        else 
         return undefined; 
       }.bind(this)); 
      } 
     } 

はそうあなたが

return this.state.company_roles.filter((role) => role.id ===id).assigned_credits; 
0

Array.mapに必要な、それを解決する別のアレイに1台のアレイ内のすべての値を変換し、両方の配列は常に同じ長さを持つことになります。上記のArray.filterまたはArray.findのように、配列から単一のオブジェクトを抽出したい場合は、この目的に適しています。 Array.findは、一部のブラウザではサポートされない可能性があることを意味するES6標準の一部です。

関連する問題