数组原型 - JavaScript 挑战
您可以在 repo Github 上找到这篇文章中的所有代码。
阵列原型相关的挑战
Array.prototype.at()
/** * @param {number} index * @return {any | undefiend} */ Array.prototype.myAt = function (index) { const len = this.length; if (index < -len || index >= len) { return; } return this[(index + len) % len]; }; // Usage example console.log([1, 2, 3, 4].myAt(2)); // => 3 console.log([1, 2, 3, 4].myAt(-1)); // => 4 console.log([1, 2, 3, 4].myAt(5)); // => undefined
Array.prototype.concat()
/** * @template T * @param {...(T | Array<T>)} itemes * @return {Array<T>} */ Array.prototype.myConcat = function (...items) { const newArray = [...this]; for (const item of items) { if (Array.isArray(item)) { newArray.push(...item); } else { newArray.push(item); } } return newArray; }; // Usage example console.log([1, 2, 3].myConcat([])); // => [1, 2, 3]; console.log([1, 2, 3].myConcat([4, 5, 6, [2]])); // => [1, 2, 3, 4, 5, 6, [2]];
Array.prototype.every()
/** * @template T * @param { (value: T, index: number, array: Array<T>) => boolean } callbackFn * @param {any} [thisArg] * @return {boolean} */ Array.prototype.myEvery = function (callbackFn, thisArg) { const len = this.length; let flag = true; for (let i = 0; i < len; i += 1) { if (Object.hasOwn(this, i) && !callbackFn.call(thisArg, this[i], i, this)) { flag = false; break; } } return flag; }; // Usage example console.log([1, 2, 3].myEvery((item) => item > 2)); // => false console.log([1, 2, 3].myEvery((item) => item > 0)); // => true
Array.prototype.filter()
/** * @template T, U * @param { (value: T, index: number, array: Array<T>) => boolean } callbackFn * @param { any } [thisArg] * @return {Array<T>} */ Array.prototype.myFilter = function (callbackFn, thisArg) { const newArray = []; for (let i = 0; i < this.length; i += 1) { if (Object.hasOwn(this, i) && callbackFn.call(thisArg, this[i], i, this)) { newArray.push(this[i]); } } return newArray; }; // Usage example console.log([1, 2, 3, 4].myFilter((value) => value % 2 == 0)); // => [2, 4] console.log([1, 2, 3, 4].myFilter((value) => value < 3)); // => [1, 2]
Array.prototype.flat()
/** * @param { Array } arr * @param { number } depth * @returns { Array } */ function flatten(arr, depth = 1) { const newArray = []; for (let i = 0; i < arr.length; i += 1) { if (Array.isArray(arr[i]) && depth !== 0) { newArray.push(...flatten(arr[i], depth - 1)); } else { newArray.push(arr[i]); } } return newArray; } // Usage example const words = ["spray", "elite", "exuberant", "destruction", "present"]; const result = words.filter((word) => word.length > 6); console.log(result); // => ["exuberant", "destruction", "present"]
Array.prototype.forEach()
/** * @template T, U * @param { (value: T, index: number, array: Array<T>) => U } callbackFn * @param {any} [thisArg] * @return {Array<U>} */ Array.prototype.myForEach = function (callbackFn, thisArg) { if (this == null) { throw new TypeError("this is null or not defined"); } if (typeof callbackFn !== "function") { throw new TypeError(callbackFn + " is not a function"); } const O = Object(this); // Zero-fill Right Shift to ensure that the result if always non-negative. const len = O.length >>> 0; for (let i = 0; i < len; i += 1) { if (Object.hasOwn(O, i)) { callbackFn.call(thisArg, O[i], i, O); } } }; // Usage example console.log( [1, 2, 3].myForEach((el) => el * el), null ); // => [1, 4, 9];
Array.prototype.indexOf()
/** * @param {any} searchElement * @param {number} fromIndex * @return {number} */ Array.prototype.myIndexOf = function (searchElement, fromIndex = 0) { const len = this.length; if (fromIndex < 0) { fromIndex = Math.max(0, fromIndex + this.length); } for (let i = fromIndex; i < len; i += 1) { if (this[i] === searchElement) { return i; } } return -1; } // Usage example console.log([1, 2, 3, 4, 5].myIndexOf(3)); // => 2 console.log([1, 2, 3, 4, 5].myIndexOf(6)); // => -1 console.log([1, 2, 3, 4, 5].myIndexOf(1)); // => 0 console.log(['a', 'b', 'c'].myIndexOf('b')); // => 1 console.log([NaN].myIndexOf(NaN)); // => -1 (since NaN !== NaN)
Array.prototype.last()
/** * @return {null|boolean|number|string|Array|Object} */ Array.prototype.myLast = function () { return this.length ? this.at(-1) : -1; }; // Usage example console.log([].myLast()); // => -1; console.log([1].myLast()); // => 1 console.log([1, 2].myLast()); // => 2
Array.prototype.map()
/** * @template T, U * @param { (value: T, index: number, array: Array<T>) => U } callbackFn * @param {any} [thisArg] * @return {Array<U>} */ Array.prototype.myMap = function (callbackFn, thisArg) { const len = this.length; const newArray = Array.from({ length: len }); for (let i = 0; i < len; i += 1) { if (Object.hasOwn(this, i)) { newArray[i] = callbackFn.call(thisArg, this[i], i, this); } } return newArray; }; // Usage example console.log([1, 2, 3, 4].myMap((i) => i)); // => [1, 2, 3, 4] console.log([1, 2, 3, 4].myMap((i) => i * i)); // => [1, 4, 9, 16])
Array.prototype.reduce()
/** * @template T, U * @param { (previousValue: U, currentValue: T, currentIndex: number, array: Array<T>) => U } callbackFn * @param {U} [initialValue] * @return {U} */ Array.prototype.myReduce = function (callbackFn, initialValue) { const hasInitialValue = initialValue !== undefined; const len = this.length; if (!hasInitialValue && !len) { throw new Error("Reduce of empty array with no initial value"); } let accumulator = hasInitialValue ? initialValue : this[0]; let startingIndex = hasInitialValue ? 0 : 1; for (let i = startingIndex; i < len; i += 1) { if (Object.hasOwn(this, i)) { accumulator = callbackFn(accumulator, this[i], i, this); } } return accumulator; }; // Usage example const numbers = [1, 2, 3, 4, 5]; const sum = numbers.myReduce((acc, num) => acc + num, 0); console.log(sum); // => 15 const products = numbers.myReduce((acc, num) => acc * num, 1);
Array.prototype.some()
/** * @template T * @param { (value: T, index: number, array: Array<T>) => boolean } callbackFn * @param {any} [thisArg] * @return {boolean} */ Array.prototype.mySome = function (callbackFn, thisArg) { const len = this.length; let flag = false; for (let i = 0; i < len; i += 1) { if (Object.hasOwn(this, i) && callbackFn.call(thisArg, this[i], i, this)) { flag = true; break; } } return flag; }; // Usage example console.log([1, 2, 3].mySome((item) => item > 2)); // => true console.log([1, 2, 3].mySome((item) => item < 0)); // => false
Array.prototype.square()
/** * @return {Array<number>} */ Array.prototype.mySquare = function () { const len = this.length; const newArray = Array.from({ length: len }); for (let i = 0; i < len; i += 1) { newArray[i] = this[i] * this[i]; } return newArray; }; // Usage example console.log([1, 2, 3].mySquare()); // => [1, 4, 9]; console.log([].mySquare()); // => [];
参考
- 伟大的前端
- Array.prototype.at() - MDN
- Array.prototype.concat() - MDN
- Array.prototype.every() - MDN
- Array.prototype.filter() - MDN
- Array.prototype.flat() - MDN
- Array.prototype.forEach() - MDN
- Array.prototype.indexOf() - MDN
- Array.prototype.map() - MDN
- Array.prototype.reduce() - MDN
- Array.prototype.some() - MDN
- 2635。对数组中的每个元素应用变换 - LeetCode
- 2634。从数组中过滤元素 - LeetCode
- 2626。数组归约变换 - LeetCode
- 2619。最后的数组原型 - LeetCode
- 2625。展平深度嵌套数组 - LeetCode
- 3.实现 Array.prototype.flat() - BFE.dev
- 151。实现 Array.prototype.map() - BFE.dev
- 146。实现 Array.prototype.reduce() - BFE.dev
以上是数组原型 - JavaScript 挑战的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务
