30 天 JavaScript 挑战

前言

大佬们好,我是一个大学生,最近在学习算法,如有错误,请多多指教,谢谢各位大佬了。

相等还是不相等

请你编写一个名为 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;
};

结语

希望大佬们指点使我成长。

相关推荐
现在,此刻8 小时前
leetcode 11. 盛最多水的容器 -java
java·算法·leetcode
☆璇9 小时前
【C++】哈希的应用:位图和布隆过滤器
算法·哈希算法
一株月见草哇10 小时前
Matlab(4)
人工智能·算法·matlab
hans汉斯11 小时前
基于深度学习的苹果品质智能检测算法研究
人工智能·深度学习·算法
火车叨位去194911 小时前
力扣top100(day01-05)--矩阵
算法·leetcode·矩阵
mit6.82411 小时前
[Robotics_py] 机器人运动模型 | `update`函数 | 微积分&矩阵
人工智能·python·算法
地平线开发者12 小时前
征程 6 | 自定义查表算子实现量化部署
算法·自动驾驶
火车叨位去194913 小时前
力扣top100(day02-05)--二叉树 02
算法·leetcode·职场和发展
James. 常德 student14 小时前
leetcode-hot-100 (图论)
算法·leetcode·图论
郝学胜-神的一滴14 小时前
C++中的`auto`与`std::any`:功能、区别与选择建议
开发语言·c++·程序人生·算法