在下面的代码中,有人可以解释为什么使用for循环返回object属性但不使用forEach。 它是与返回对象引用相关的东西还是特定于数组上的forEach循环的东西?
var empModule = (function(){
var empArray = [{
"name":"Aish",
"age":"27",
"location": "All"
},{
"name":"Anu",
"age":"26",
"location": "Muz"
},{
"name":"Vern",
"age":"25",
"location": "Mang"
}];
var searchAge = function(name){
for(var i=0;i<empArray.length;i++) {
if(empArray[i].name === name) {
return empArray[i].age;
}
};
};
var searchLocation = function(name){
empArray.forEach(function(obj){
if(name === obj.name) {
return obj.location;
}
});
};
return {
findAge: searchAge,
findLocation: searchLocation
};
})();
var secAge = empModule.findAge("Anu");
console.log(secAge); // Correct Output
var thirdLoc = empModule.findLocation("Vern");
console.log(thirdLoc); // Returns undefined
答案 0 :(得分:2)
return
返回其所在的函数。在for..
示例中,searchAge
。当您使用forEach()
时,您将传递回调函数,因此您将值返回到该回调。你永远不会在searchLocation
中返回任何内容。
你应该在这里两次使用常规的for..
循环。
答案 1 :(得分:2)
在java脚本中没有forEach
的中断方法。
如果您使用
return obj.location
它对它没有影响
但是当你在for循环中使用return方法时,它会中断并返回值。
Some
休息return true
,every
休息return false;
试试这个
var location = "";
empArray.some(function (obj) {
if (name === obj.name) {
location = obj.location;
return true;
}
});
return location;
或尝试这样
var location = "";
empArray.every(function (obj) {
if (name === obj.name) {
location = obj.location;
return false;
}
});.
return location;
答案 2 :(得分:1)
那是因为在下面的代码片段中
var searchLocation = function(name){
empArray.forEach(function(obj){
if(name === obj.name) {
return obj.location;
}
});
};
如果你想做同样的事情,请使用filter,如下文
var searchLocation = function(name){
return empArray.filter(function(obj) {
return name === obj.name
})[0].location;
};
return
语句将作为anonymous function
的参数提供给foreach
函数,而不是searchLocation
函数。
答案 3 :(得分:0)
来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
forEach()为每个数组元素执行一次回调函数; 与every()和some()不同,它总是返回undefined值。
所以你可以尝试这个设置变量并在循环之后返回它:
var searchLocation = function(name){
var result;
empArray.forEach(function(obj){
if(name === obj.name) {
result = obj.location;
}
});
return result;
};