forEach on a map function js assertion test not 运行

forEach on a map function js assertion test not running

我目前正在为 map/cubeAll 函数进行断言测试。我已经多次修改我的逻辑和语法,但我一直无法发现编译器抛出 "Type Error array.forEach is not a function" 错误的原因。我已经阅读了关于 TypeError 错误的 MDN 页面,我知道我的“forEach”试图从一个函数中调用一个值,并且 Array.prototype.forEach 需要一个回调函数才能正常工作。根据我的逻辑,在我的代码(下面)中,我确实有一个回调函数,我试图通过将数组的每个元素传递给这个回调函数来调用一个值。怎么了?

function map(array, callbackFunction) {
  var newArray = [];
  array.forEach(function(element) {
    newArray.push(callbackFunction(element));
  });
  return newArray;
}

function cubeAll(numbers) {
  return map(numbers, function(n) {
    return n * n * n;
  });
}

function assertArraysEqual(actual, expected, testName) {
  let arraysHaveEqualLength = actual.length === expected.length;
  let arraysHaveSameElements = actual.every(function(ele,idx){
    return ele === expected[idx];
  });
  if(arraysHaveEqualLength && arraysHaveSameElements){
    console.log(`${testName} has passed.`);
  }else {
    console.log(`${testName} has FAILED. Expected ${expected} and got ${actual} instead.`);
  }
}

我正在尝试测试的案例:

assertArraysEqual(map([3,2,1],cubeAll),[27,8,1], 'it should return a new array with all the elements cubed');
assertArraysEqual(map([3,2,1],cubeAll),[27,7,1], 'it should return a new array with all the elements cubed');

控制台错误:

 array.forEach(element => newArray.push(callbackFunction(element)));
        ^

TypeError: array.forEach is not a function

谢谢!

函数 cubeAll 接收数字而不是数组。

function cubeAll(n) {
    return n * n * n;
}

您可以使用 built-in 对象 Math 和函数 .pow(...):

return Math.pow(n, 3);

对于支持ES2016的环境(常青浏览器,node 7+)

function cubeAll(n) {
    return n ** 3;
}

function map(array, callbackFunction) {
  var newArray = [];
  array.forEach(function(element) {
    newArray.push(callbackFunction(element));
  });
  return newArray;
}

function cubeAll(n) {
  return n ** 3;
}

function assertArraysEqual(actual, expected, testName) {
  let arraysHaveEqualLength = actual.length === expected.length;
  let arraysHaveSameElements = actual.every(function(ele,idx){
    return ele === expected[idx];
  });
  if(arraysHaveEqualLength && arraysHaveSameElements){
    console.log(`${testName} has passed.`);
  }else {
    console.log(`${testName} has FAILED. Expected ${expected} and got ${actual} instead.`);
  }
}


assertArraysEqual(map([3,2,1],cubeAll),[27,8,1], 'it should return a new array with all the elements cubed');
assertArraysEqual(map([3,2,1],cubeAll),[27,7,1], 'it should return a new array with all the elements cubed');