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

结语

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

相关推荐
科大饭桶5 分钟前
数据结构自学Day5--链表知识总结
数据结构·算法·leetcode·链表·c
我爱C编程2 小时前
基于Qlearning强化学习的1DoF机械臂运动控制系统matlab仿真
算法
chao_7892 小时前
CSS表达式——下篇【selenium】
css·python·selenium·算法
chao_7892 小时前
Selenium 自动化实战技巧【selenium】
自动化测试·selenium·算法·自动化
YuTaoShao2 小时前
【LeetCode 热题 100】24. 两两交换链表中的节点——(解法一)迭代+哨兵
java·算法·leetcode·链表
怀旧,2 小时前
【数据结构】8. 二叉树
c语言·数据结构·算法
泛舟起晶浪2 小时前
相对成功与相对失败--dp
算法·动态规划·图论
地平线开发者3 小时前
地平线走进武汉理工,共建智能驾驶繁荣生态
算法·自动驾驶
IRevers4 小时前
【自动驾驶】经典LSS算法解析——深度估计
人工智能·python·深度学习·算法·机器学习·自动驾驶
前端拿破轮4 小时前
翻转字符串里的单词,难点不是翻转,而是正则表达式?💩💩💩
算法·leetcode·面试