2017-07-15 115 views
-2

我有对象的数组:JavaScript函数可以CONSOLE.LOG值,但不会返回它

let array = [ 
    { 
    id: 0, 
    name: "Name0" 
    }, 
    { 
    id: 1, 
    name: "Name1" 
    } 
] 

和功能,通过数组迭代,搜索对象具有指定ID属性,而应返回对象名称属性:

function getName1(id) { 
    array.map((object) => { 
    if(object["id"] === id) 
     return object["name"] 
    }) 
} 

但是这个代码

console.log(getName1(0)) // undefined 

回报不确定

如果我只是CONSOLE.LOG对象的名称在函数内部

function getName2(id) { 
    array.map((object) => { 
    if(object["id"] === id) 
     console.log(object["name"]) 
    }) 
} 

它工作完全正常:

getName2(0) // "Name1" 

我基本上只是想

getName1(0) 

返回

Name0 

我该如何做到这一点?

+0

请仅使用合适的标签。这与[tag:asynchronous]或[tag:undefined]无关,可以说与[tag:return]无关。 –

+0

您的函数getName1不返回任何内容。 return语句不在getName1函数中。你需要迭代数组来寻找匹配,然后返回该值。我不认为地图是你想要的。查看减少或只是迭代数组 – terpinmd

回答

1

问题是您的return声明从map回调中返回,而不是从getName1返回。

根本不应该使用map,它的工作是根据回调的返回值创建一个新的数组。

相反,使用Array#find,其任务是寻找到给定的回调函数返回一个truthy值数组中的第一项,然后返回找到的条目中是否有任何name属性:

function getName1(id) { 
    const entry = array.find(object => object.id === id); 
    return entry && entry.name; 
} 

还是在ES5和更早版本(我用ES2015 +上面,因为你用一个箭头功能):

function getName1(id) { 
    var entry = array.find(function(object) { return object.id === id; }); 
    return entry && entry.name; 
} 

entry && entry.name部分的意思是“如果entry是truthy,返回entry.name;否则,返回entry(虚假值)本身。“在这种情况下,如果找不到条目(因为这是Array#find在条目未找到时返回的内容)或name找到的条目,将返回null

+0

非常感谢!我完全“忘记”我正在使用地图..有时你只是在一段时间后失明,我猜:) 如果我理解正确,那么得到我想要的东西的“老派”方式就是循环数组('for(let i = 0; i Skilla123

+0

@ Skilla123:是的,这的确是另一种方式来做到这一点。 –