您是否曾经使用过 Object.entries 并想知道它是如何工作的?比你想象的要简单得多!
这是一个基本实现:
function objectEntries(obj) { const entries = []; for (const key in obj) { if (Object.hasOwn(obj, key)) { entries.push([key, obj[key]]); } } return entries; }
然而,这段代码还不够好——如果对象很大怎么办?在执行该函数的整个过程中,基于数组的方法的性能必须存储在内存中。如果你再次使用它呢?它必须同样构建并在内存中保存一个新数组。在现实世界中,这可能会导致严重的性能问题,并且在某些时候我们需要适应性能。然而,有一个优雅的解决方案可以解决所有这些问题,其中 Symbol.iterator 来拯救!
这是更新的片段:
function objectEntries(obj) { return { [Symbol.iterator]() { const keys = Object.keys(obj); let index = 0; return { next() { if (index为什么使用Symbol.iterator进行迭代?
在我们的初始实现中,objectEntries 函数在内存中构建所有条目([key, value] 对)的数组,如果对象具有大量属性,这可能会出现问题。将所有条目存储在数组中意味着我们必须提前为每一对分配内存。这种方法对于较小的对象来说相当不错,但随着对象大小的增加,它很快就会变得低效并且速度很慢。
在更新的代码中,我们在保存迭代逻辑的对象上定义[Symbol.iterator]。让我们一步步分解:
将 Symbol.iterator 应用于自定义循环
让我们更深入地了解这些方法如何提供对循环行为的更多控制。提供的每个示例都演示了与数组数据交互的独特方式,为您的代码增加了很大的灵活性。我们将探讨每种方法的含义以及如何在不同场景中利用它们。
在这些示例中,我将使用示例方法扩展数组原型(有关原型的更多信息),以使我的代码更易于阅读。让我们直接进入吧!
例如,此反向迭代器方法在聊天应用程序之类的应用程序中很有用,您可能希望首先显示最新的消息。聊天应用程序因拥有大量数据(在本例中为消息)而臭名昭著。使用reverseIterator,您可以迭代消息列表并按所需顺序显示它们,而无需创建新的反向数组。
Array.prototype.reverseIterator = function() { let index = this.length - 1; return { [Symbol.iterator]: () => ({ next: () => { if (index >= 0) { return { value: this[index--], done: false }; } return { done: true }; } }) }; }; const numbers = [1, 2, 3, 4, 5]; for (const num of numbers.reverseIterator()) { console.log(num); // 5, 4, 3, 2, 1 }
这种独特的方法使您能够迭代数组,同时确保仅生成唯一值。这对于动态消除重复项非常有用,无需提前过滤并使用更多内存。
Array.prototype.unique = function() { const seen = new Set(); return { [Symbol.iterator]: () => ({ next: () => { for (let i = 0; i下面的 chunk 方法在处理大型数据集时非常有用,您可以将它们分成较小的块来处理,以减少内存使用并提高性能。假设您正在从 CSV 文件之类的文件导入数据,您可以在更具可扩展性的段中读取和处理它。此外,在 Web 用户界面中,分块可用于分页,允许您在每页显示特定数量的项目或帮助您更好地管理无限加载器。
Array.prototype.chunk = function(size) { let index = 0; return { [Symbol.iterator]: () => ({ next: () => { if (index结论
在本文中,我们探讨了 Symbol.iterator 如何自定义逻辑并提高循环效率。通过在 Array.prototype(或任何其他可迭代的效果)上实现自定义可迭代方法,我们可以有效地管理内存使用并控制循环的运行方式。
objectEntries 的初始示例演示了基于数组的方法在处理大型对象时如何导致性能问题。然而,通过使用 SYmbol.iterator,我们创建了一个有效的解决方案,允许我们迭代对象条目,而无需不必要的内存分配开销。
我们还研究了几个实际示例,说明扩展 Array.prototype 如何促进开发人员日常处理的各种现实场景。
有了这些强大的工具,您可以更好地解决 JavaScript 中复杂的数据处理场景,对应用程序的性能影响几乎为零。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3