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

结语

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

相关推荐
NAGNIP8 小时前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队9 小时前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja14 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下14 小时前
最终的信号类
开发语言·c++·算法
茉莉玫瑰花茶14 小时前
算法 --- 字符串
算法
博笙困了14 小时前
AcWing学习——差分
c++·算法
NAGNIP14 小时前
认识 Unsloth 框架:大模型高效微调的利器
算法
NAGNIP14 小时前
大模型微调框架之LLaMA Factory
算法
echoarts14 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Python技术极客14 小时前
一款超好用的 Python 交互式可视化工具,强烈推荐~
算法