从列表键中反映提取值

时间:2017-07-02 19:03:55

标签: javascript arrays reactjs hashmap

 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)条件对于单个值始终为真。

5 个答案:

答案 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.filterArray.find将更好地用于此目的。请注意,Array.find是ES6标准的一部分,这意味着某些浏览器可能不支持它。