前言
大佬们好,我是一个大学生,最近在学习算法,如有错误,请多多指教,谢谢各位大佬了。
相等还是不相等
请你编写一个名为 expect
的函数,用于帮助开发人员测试他们的代码。它应该接受任何值 val
并返回一个包含以下两个函数的对象。
toBe(val)
接受另一个值并在两个值相等(===
)时返回true
。如果它们不相等,则应抛出错误"Not Equal"
。notToBe(val)
接受另一个值并在两个值不相等(!==
)时返回true
。如果它们相等,则应抛出错误"Equal"
。
考察点有:需要对 JavaScript 的概念有较强的掌握,包括对象、函数以及严格相等和不相等运算符(=== 和 !==)。此外,还需要了解 JavaScript 的错误处理机制,特别是 throw 语句。当然这对于你们来说很简单。
实现:
可以通过给定的函数表达式或构造一个额外的 ES6 类来实现。
javaScript
/**
* @param {string} val
* @return {Object}
*/
var expect = function (val) {
return {
return {
toBe(val2) {
if (val !== val2) throw new Error("Not Equal")
return true;
}
noToBe(val2){
if(val === val2) throw new Error("Equal")
return true;
}
};
};
/**
* expect(5).toBe(5); // true
* expect(5).notToBe(5); // throws "Equal"
*/
转换数组中的每个元素
编写一个函数,这个函数接收一个整数数组 arr
和一个映射函数 fn
,通过该映射函数返回一个新的数组。
- 返回数组的创建语句应为
returnedArray[i] = fn(arr[i], i)
。 - 请你在不使用内置方法
Array.map
的前提下解决这个问题。
考察点有:这个问题再介绍回调函数(callbacks)
。回调函数被定义为作为参数传递给另一个函数的函数。对回调函数的理解非常关键,因为几乎在任何JavaScipt代码库中它都被频繁使用,并且对于编写可重用的代码至关重要。
实现
将值写入初始为空的数组
在 JavaScript 中,你可以读取和写入不在范围 [0, arr.length) 内的索引。与普通对象一样,访问不存在的索引会返回 undefined。通常不鼓励写入不存在的索引,因为除了令人困惑之外,它还会导致性能慢且不可预测。这种方法对 500 万个元素需要约 250 毫秒。
javascript
/**
* @param {number[]} arr
* @param {Function} fn
* @return {number[]}
*/
var map = function(arr, fn) {
let newArr = [];
for (let i = 0; i < arr.length; i++) {
newArr[i] = fn(arr[i], i);
}
return newArr;
};
过滤数组中的元素
给定一个整数数组 arr
和一个过滤函数 fn
,并返回一个过滤后的数组 filteredArr
。
fn
函数接受一个或两个参数:
arr[i]
-arr
中的数字i
-arr[i]
的索引
filteredArr
应该只包含使表达式 fn(arr[i], i)
的值为 真值 的 arr
中的元素。真值 是指 Boolean(value)
返回参数为 true
的值。
请在不使用内置的 Array.filter
方法的情况下解决该问题。
实现
将值推入新数组
可以创建一个新数组,将满足 fn(arr[i], i)
返回真值的所有值都推入其中。这是通过迭代原始数组中的每个元素来完成的。
javaScript
/**
* @param {number[]} arr
* @param {Function} fn
* @return {number[]}
*/
var filter = function(arr, fn) {
let newArr =[];
for(let i=0;i<arr.length;i++){
if(fn(arr[i],i)){
newArr.push(arr[i])
}
}
return newArr;
};
结语
希望大佬们指点使我成长。