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;
};

结语

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

相关推荐
董董灿是个攻城狮11 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员18 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish19 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱20 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者2 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考2 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx2 天前
CART决策树基本原理
算法·机器学习
Wect2 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript