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');
我目前正在为 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');