为什么这个匿名函数在Javascript中返回undefined?

时间:2016-01-26 17:55:16

标签: javascript arrays foreach

我试图创建一个带有数组和函数的forEach()函数,然后对数组的每个元素执行函数操作。但是,在尝试传递以下匿名函数时,我得到undefined。我在阅读其他帖子之后尝试向return函数添加forEach(),但之后函数根本没有运行,只返回收到的第一个array[i]而不修改它。

function forEach(array, action){
 for(var i = 0; i < array.length; i++)
   action(array[i]);
}

var myArray = [1, 2, 3];
var something = forEach(myArray, function(element){return element++;});
console.log(something)
//undefined

返回undefined

function forEach(array, action){
 for(var i = 0; i < array.length; i++)
   return action(array[i]);
}

var myArray = [1, 2, 3];
var something = forEach(myArray, function(element){return element++;});
console.log(something)
//undefined

返回1

我错过了什么?

(我知道.forEach()函数存在,我正在尝试将其作为学习练习)

2 个答案:

答案 0 :(得分:3)

您的forEach功能无法返回任何内容。看起来您正在尝试map实施。如果是这样,您需要将结果添加到新数组并返回该数组。

function map(array, action) { // Renamed forEach to a more suitable name
  var results = [];
  for (var i = 0; i < array.length; i++) {
    results.push(action(array[i]));
  }
  return results;
}

答案 1 :(得分:0)

您的foreach实施是正确的 - 它不应该返回任何内容。如果您想要map(即将参数转换为新数组),您可以先实现reduce

function reduce(array, action, result) {
    forEach(array, function (elem) {
        result = action(result, elem);
    });
    return result;
}

然后,通过map定义reduce

function map(array, action) {
    return reduce(array, function (result, elem) {
        return result.concat(action(elem));
    }, []);
}

全部放在一起:

function forEach(array, action) {
    for (var i = 0; i < array.length; i++)
        action(array[i]);
}

function reduce(array, action, result) {
    forEach(array, function (elem) {
        result = action(result, elem);
    });
    return result;
}

function map(array, action) {
    return reduce(array, function (result, elem) {
        return result.concat(action(elem));
    }, []);
}

a = map([1, 2, 3, 4], function (x) {
    return ++x
});
document.write('<pre>' + JSON.stringify(a, 0, 3));