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
,但有更优雅的方法吗?
编辑:if (cr.id === id)
条件对于单个值始终为真。
答案 0 :(得分:1)
编辑:试试......
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;
});
答案 1 :(得分:1)
如果要查找单个值的数组,请使用Array.prototype.find
。
调整到您的示例:
const foundCompanyRoleItem = this.state.company_roles.find(crItem => crItem.id === id);
return foundCompanyRoleItem.assigned_credits;
这将始终返回匹配值而不是数组,如.filter
。
P.S。:我建议您也为项目使用ES6语法。在上面的示例中,您可以看到好处,因为我的示例使用ES6中引入的箭头函数。它使表达更清晰,更合理。
答案 2 :(得分:0)
为什么你不直接在company_roles上使用filter
?
getEmployeeCredits(id) {
if (this.state.company_roles) {
return this.state.company_roles.filter(cr => cr.id === id);
}
}
答案 3 :(得分:0)
这是因为if语句只对一个值为true,其余的是隐式返回undefined。
return this.state.company_roles.filter((role) => role.id ===id ).assigned_credits;
所以要解决它你需要
{{1}}
答案 4 :(得分:0)
Array.map
将一个数组中的所有值转换为另一个数组,两个数组的长度始终相同。如果您想从上面提到的数组中提取单个对象,Array.filter
或Array.find
将更好地用于此目的。请注意,Array.find
是ES6标准的一部分,这意味着某些浏览器可能不支持它。