使用yield*和function*修改默认的对象(key-value)或数组遍历顺序

JavaScript Generator原理与手写co:协程调度与异步本质 Generator是JavaScript中实现协程调度的核心机制,其本质并非‘化异步为同步’,而是一种显式可控的状态机——通过yield暂停、next恢复,将函数执行流拆分为可中断、可复用的步骤。它不处理异步逻辑本身,而是为Promise、fetch等异步操作提供分段描述能力,构成async/await的语义基石。技术价值在于赋予开发者对执行权的精细控制,支撑Koa中间件、Webpack Tapable、Jest数据驱动等工程实践。本文深入解析Generator状态机原理、迭代器协议、错误注入机制,并手写生 阅读详情

需求:在v-for一个对象Object时,需要按照对象内某个键值对内的值进行遍历。
对象类型如下:

let itemTypes = {
    A:{
      bestPrice: 5
    },
    B:{
      bestPrice: 1
    },
    C:{
      bestPrice: 3
    },
    D:{
      bestPrice: 2
    }
  }

期望 v-for=“(value, key) in itemTypes” 遍历顺序,根据bestPrice价格升序遍历

[ "B", { "bestPrice": 1 } ]
[ "D", { "bestPrice": 2 } ]
[ "C", { "bestPrice": 3 } ]
[ "A", { "bestPrice": 5 } ]

解决方案

  • 使用yield* 和function*修改默认的遍历逻辑。
/*
* Symbol.iterator代表对象itemTypes对象的默认迭代器。
* function*用来在表达式内定义构造器函数
* yield*操作用来委托例如构造器函数给另一个可迭代对象
* Object.entries()方法获取键值对数组
*/
itemTypes[Symbol.iterator] = function* () {
  yield* [...Object.entries(this)].sort((a, b) => a[1].bestPrice - b[1].bestPrice);
};

全部示例代码

<script setup>
import {reactive} from "vue";

let  itemTypes = reactive({
  A:{
    bestPrice: 5
  },
  B:{
    bestPrice: 1
  },
  C:{
    bestPrice: 3
  },
  D:{
    bestPrice: 2
  }
})


itemTypes[Symbol.iterator] = function* () {
  yield* [...Object.entries(this)].sort((a, b) =>b.bestPrice -  a.bestPrice );
};

</script>

<template>
  <div >
    <div v-for="(value, key) in itemTypes" :key="key">
      {{value}}
    </div>
  </div>
</template>

拓展

  • 修改期望遍历顺序和结果
    期望 v-for=“(value, key) in itemTypes” 遍历顺序,根据bestPrice价格降序遍历,并且value不包含键key
/*
* 期望的结果
*/
{ "bestPrice": 5 }
{ "bestPrice": 3 }
{ "bestPrice": 2 }
{ "bestPrice": 1 }
/*
* 解决方案
*
* Symbol.iterator代表对象itemTypes对象的默认迭代器。
* function*用来在表达式内定义构造器函数
* yield*操作用来委托例如构造器函数给另一个可迭代对象
* Object.values获取对象内值数组,不包含key
*/
itemTypes[Symbol.iterator] = function* () {
  yield* [...Object.values(this)].sort((a, b) => a[1].bestPrice - b[1].bestPrice);
};
  • 知识点解析
    • Symbol.iterator这个静态数据属性指代的是 @@iterator符号。 遍历协议(iterable protocol) 在遍历对象时,
      会寻找这个符号对应的方法作为该对象的迭代器返回。而一个对象必须拥有@@iterator符号,才是可迭代的。
    • function 用于定义函数。
    • function* 用于定义生成器函数,返回值为Generator对象,符合 可迭代协议(iterable protocol) 和 迭代器协议(iterator protocol),主要用于迭代。
    • yield 用于暂停和恢复一个生成器函数
    • yield* 用于委托生成器函数给一个可迭代对象。
    • Object.values(obj) 可获取对象内的值数组。
    • Object.entries(obj) 可获取对象内的键值对数组。
Python面试核心:从对象引用到装饰器,深度解析基础原理与实战 在编程语言中,理解变量、函数和对象的底层原理是构建扎实基本功的关键。Python采用“传递对象引用”的参数传递机制,这意味着函数参数传递的是对象的引用而非副本,这一设计直接影响了对可变与不可变对象的操作行为,是理解内存管理和副作用的基础。深入掌握这一原理,对于编写高效、可靠的代码至关重要,尤其是在涉及默认参数陷阱、深浅拷贝等场景时。基于函数式编程思想,装饰器作为Python的高级特性,允许在不修改原函数代码的前提下动态增强功能,广泛应用于日志、缓存、权限校验等场景,体现了代码复用和关注点分离的工程价值。本文 阅读详情

相关推荐

适合小白的超详细yolov8环境配置+实例运行教程,从零开始教你如何使用yolov8训练自己的数据集(Windows+conda+pycharm)

yolov8源码下载地址:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLiteyolov8使用文档: Home - Ultralytics YOLOv8 Docs教学视频参考: 包会!YOLOv8训练自己的数据集_哔哩哔哩_bilibili先用conda prompt创建一个虚拟环境,我的叫yolov8, python版本用3.10 源码地址:GitHub - ul

CV在读 25万+

JavaScript生成器:协程式控制流与V8状态机原理

生成器(Generator)是JavaScript中实现协程式控制流的核心机制,其本质并非语法糖,而是基于V8引擎原生字节码(如Yield指令)构建的可暂停、可恢复的状态机。它通过yield表达式建立双向通信通道,支持按需产出、天然取消与精确错误传播,在流式处理、状态建模和异步协调等场景中展现出远超Promise和async/await的可控性。结合for...of迭代协议与Symbol.iterator定制能力,生成器可安全封装资源生命周期;而Bun等新运行时的性能跃升,更使其在高频实时系统中具备工程落地

weixin_34274029的博客 470

「点燃我,温暖你」用Python制作一个动态爱心效果

最近「点燃我,温暖你」这部剧非常火,讲述的是程序员的爱情故事。其中陈飞宇饰演的男主李峋,在剧中用程序做出的爱心跳动效果,非常炫。

Modeler_xiaoyu的博客 1万+

yield方法的使用

yield方法的使用

小郑要做干饭人的博客 494

c语言压力变送器程序设计,基于单片机的压力变送器设计

基于单片机的压力变送器设计(任务书,开题报告,外文翻译,论文15000字,代码)摘要随着工业化水平的不断提高,新型智能仪表在工业生产过程中运用也越来越广泛,同时对输出数据的准确检测和处理也变得至关重要。生产过程的运行和设备安全是极其重要的,那么如何实现对其精确的检测呢?众所周知,在工业生产过程中有一个很重要参数——压力,显然这个参数是一个必不可少的条件。故而,研究智能压力变松器系统对工业生产有着不...

weixin_33681561的博客 1962

BF8815A

了解ADBMS1818芯片的人会发现,这款BF8815B和1818有着很多相似的东西,当你了解其中一款AFE之后,另一款你的上手也会特别快,下面文章是我针对1818梳理的一些重要知识点,此篇文章主要讲解BF8815B的一些差异点。

m0_61973119的博客 561

Vue 入门

属性绑定 [ :attr="" ]: &lt;!-- 属性绑定 ":title"为"v-bind:"的缩写 --&gt; &lt;span :title="msg1"&gt; 数据绑定:{{ msg2 }} &lt;/span&gt; 事件绑定/事件处理 [ @click="" ]: &lt;!-- 传递事件,'clickFn1(e)',

hozee的个人笔记 351

ABB机器人与S7-1200PLC实现位置坐标数据发送和接收的具体方法

ABB机器人与S7-1200PLC实现位置坐标数据发送和接收的具体方法

Robot_PLC_HMI_Automation 2916

vue 方法使用注意事项

apply(target, object, args):拦截 Proxy 实例作为函数调用的操作,比如proxy(...args)、proxy.call(object, ...args)、proxy.apply(...)。当vue中的数据修改后,会重新生成一份虚拟DOM,并跟之前的虚拟DOM进行匹配,如果两份虚拟DOM中的key和key对应的值完全相同,不会重新生成对应的真实DOM;g1() yield出去的每个值都会在g2()的next()方法中返回,就像那些yield语句是写在g2()里一样。

wenyun936的博客 1826

基于SOLIDWORKS API的工业级插件开发指南

SOLIDWORKS API是基于COM技术的一套开发接口,支持C#、VB.NET等语言,用于自动化建模、属性管理、界面定制等功能。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 2746

Vue2 - 最新实现接入使用天地图及卫星视图切换功能,在国家天地图上自由切换地图显示类型(卫星视图/地形视图/卫星混合/地形混合/普通视图)vue天地图切换视图显示改成卫星风格,切换地图图层完整代码

vue2,nuxt2,天地图,视图,卫星,地图类型切换,vue天地图,改成卫星视角,在线地图切换,来回切换卫星图,天地图如何实现来回切换卫星图,地形图,卫星视图,vue中使用天地图自定义样式切换地图图层,切换报错,加载出错,卫星图太卡,地图图层更换,vue安装集成天地图详细示例源码,切换地图的样式,在天地图中如何将地图的类型随意更换,提供多种视图模式用户自由点击更换,VUE引入天地图卫星版,详细教程示例源码代码,天地图切换卫星用什么api,卫星视角API方法,vue2卫星天地图,能改地图的显示方式,图层类型

🏆 前端领域优质创作者 4140

vue中迭代器的使用

vue中迭代器的使用

weixin_46194350的博客 512

地图自定义编码CSV转换成ini文件

创 建 schema.ini 文件:有时,当您尝试使用 .csv 文件将自定义地理信息导入 Tableau 时,您可能会看到“无法使用.csv,因为它不包含唯一列”错误消息。这是因为您的 .csv 文件可能包含数值数据,例如数值邮政编码。对于新的地理角色,Tableau 将只接受文本字段。但是,您可以创建一个 schema.ini 文件,以指示 Tableau 应将您要导入的数值字段视为文本字段。...

wenyusuran的专栏 1975

yield迭代协议与异步处理、proxy代理、装饰器<前端学习笔记>

1.2 为什么要有两个协议 1.3 都有哪些语法或特性,使用或实现了可迭代协议与迭代器协议 2. Generator函数与异步应用 2.1 基本用法 2.2 next传递参数 next()函数及参数 next() 传参是对yield整体的传参 (把yield也包括进去),否则yield类似于return 2.3 用for…of迭代generators 2.4 generators处理异步 2.5 封装异步处理函数 类似于co中的使用方式 3. async函数 3.1 基本用法 封

DZW5323的博客 784

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Python函数全解析:从基础语法到高阶应用与实战技巧

在编程中,函数是实现代码复用和模块化的核心概念,它通过封装特定逻辑来提升代码的可维护性和可读性。其工作原理基于参数传递、作用域和返回值机制,允许开发者构建灵活且高效的软件组件。掌握函数对于任何编程任务都具有重要价值,尤其在数据处理、Web开发和自动化脚本等应用场景中不可或缺。本文聚焦于Python函数,深入探讨了参数传递的两种方式(位置参数与关键字参数)、变量的作用域规则(LEGB),并详细解析了高阶函数、装饰器以及生成器等进阶主题,旨在帮助读者从基础到精通,全面掌握这一编程利器。

cigang4063的博客 393

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

RxJS from操作符:统一适配Promise、数组、迭代器等异步数据源

Observable 是 RxJS 的核心抽象,而将各类原始数据源(如 Promise、数组、NodeList、Map/Set 迭代器、生成器函数)可靠地转换为 Observable,是构建响应式流的第一步。from 操作符并非简单‘转数组’,而是基于可订阅(subscribable)与可迭代(iterable)协议的智能识别器,通过优先级探测机制自动选择最适配的转换策略。它解决了多源异步数据在统一流控下语义保真与错误隔离的关键问题,支撑防抖请求、混合本地/远程建议、容错重试等典型工程场景。作为 RxJS

stevenbill的博客 570

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深入理解JavaScript迭代器:从协议到函数式编程实践

迭代是编程中的基础概念,指按顺序重复访问数据集合的过程。其核心原理在于通过统一的协议实现数据访问的标准化,从而将数据结构与遍历逻辑解耦。这一机制的技术价值在于支持惰性求值,能够高效处理大规模数据流或无限序列,避免不必要的内存消耗。在实际应用场景中,迭代器协议是JavaScript中for...of循环、扩展运算符等现代语言特性的基石,也是实现函数式编程中声明式数据处理管道的关键。通过生成器函数和自定义迭代器,开发者可以构建灵活的数据处理流程,自然收敛到对迭代器函数操作和异步迭代器等高级主题的深入探讨。

aoe41606的博客 382

JavaScript循环结构与数据类型实战指南

循环结构是编程中的基础控制结构,通过重复执行代码块来处理批量数据。在JavaScript中,for循环是最常用的迭代方式,配合数据类型如数组和对象,能高效处理数据集合。理解循环执行流程和变量作用域对编写可靠代码至关重要。实际开发中,循环常用于数据处理、表单验证和API调用等场景。结合ES6引入的for...of循环和迭代器协议,现代JavaScript提供了更简洁的遍历方式。掌握循环优化技巧如减少内部计算和避免闭包陷阱,能显著提升前端性能。

huqiyes的专栏 435

JavaScript 可迭代协议:从 for...of 到自定义迭代器的底层原理

可迭代协议(Iterable Protocol)是 JavaScript 中统一数据消费的核心机制,其本质是通过 Symbol.iterator 方法返回符合迭代器(Iterator)规范的对象,实现数据生产与消费的解耦。该协议支撑了 for...of、展开运算符、Array.from 等关键语法,其原理基于状态机式的 next() 方法,返回 {value, done} 结构,确保按需、延迟、单向遍历。技术价值在于提升内存效率(如避免大数组全量映射)、支持异步流(AsyncIterator)、增强类型系统

weixin_30292745的博客 426

JavaScript filter() 源码级解析:纯函数性、稀疏数组与防御性封装

filter() 是 JavaScript 数组中最基础的高阶函数之一,其本质是依据回调返回值执行布尔投影的同步条件压缩操作。它严格遵循纯函数原则,不修改原数组,也不隐式处理 null/undefined;核心逻辑依赖 'i in this' 判断索引存在性,并通过 ToBoolean 规则转换回调结果——这意味着空字符串、0、NaN 等 falsy 值均被过滤,而对象、数组等 truthy 值全被保留。这一机制在处理稀疏数组、嵌套数据、TypeScript 可选属性及异步 Promise 时极易引发运行时

cmff98425的博客 484

JavaScript实现JSON数据扁平化:从原理到实战应用

JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在现代Web开发中扮演着重要角色。其核心原理是基于键值对的结构化数据表示,通过递归或迭代算法可以实现复杂嵌套结构的扁平化处理。这种技术价值在于显著提升数据访问效率,特别是在前端开发中,扁平化后的数据结构能够优化渲染性能,简化组件间的数据传递。在实际应用场景中,JSON扁平化技术广泛应用于API数据适配、表格渲染优化、配置文件解析等场景。通过递归算法遍历嵌套对象,结合数组索引处理策略,可以高效实现复杂JSON到扁平结

weixin_30340617的博客 419

Python函数进阶:从闭包、装饰器到函数式编程实战

在Python编程中,函数作为一等对象是其核心设计理念,这意味着函数可以像变量一样被赋值、传递和返回。这一特性构成了许多高级编程范式的基础,例如闭包和装饰器。闭包允许函数记住其定义时的上下文环境,常用于数据封装和回调函数设计;而装饰器则基于闭包实现,提供了一种在不修改源代码的情况下增强函数功能的强大机制,广泛应用于日志记录、权限校验和性能监控等场景。函数式编程工具如lambda表达式、map、filter和reduce,结合functools模块的partial、lru_cache等工具,能显著提升代码的简

weixin_33946605的博客 494

Python可变与不可变类型深度解析:从面试陷阱到生产级设计

Python中的可变性与不可变性并非简单的‘能否修改’,而是由类型方法契约(如__add__ vs __iadd__)和对象生命周期共同定义的核心机制。理解这一原理,是掌握内存共享、浅深拷贝、默认参数陷阱、字典键哈希约束等关键行为的基础。它直接决定代码在多线程、异步、序列化及大型数据结构中的稳定性与可预测性。本文以真实面试高频问题为入口,结合CPython实现细节与金融、物联网、Web服务等典型工程场景,系统揭示字符串驻留、列表迭代器状态、闭包变量绑定时机、装饰器执行顺序等隐式规则,帮助开发者跨越‘能写’到

corg81763的博客 391

python学习笔记day2

Python 3.10 增加了 match...case 的条件判断,不需要再使用一连串的 if-else 来判断了。match 后的对象会依次与 case 后的内容进行匹配,如果匹配成功,则执行匹配到的表达式,否则直接跳过,_ 可以匹配一切。例子: 二、循环语句 循环控制关键字与方法 迭代循环,用于遍历序列或可迭代对象 条件循环,条件为 True 时持续执行 立即终止当前循环

X_xiaojuzi的博客 260

Updating -- Python知识

学得快忘得也快,记录一些Python小知识

Rolei的博客 1万+

JavaScript迭代器协议深度解析:从for...of到异步迭代与生成器实战

在编程中,迭代是处理数据集合的基础操作,其核心在于提供一种标准化的数据访问机制。迭代器协议定义了统一的顺序访问接口,通过next()方法按需产生值序列,而可迭代协议则要求对象实现Symbol.iterator方法以提供迭代器。这一设计模式的技术价值在于解耦数据源与遍历逻辑,使得数组、Map、Set等不同数据结构都能通过for...of循环等语法一致处理,极大提升了代码的通用性和可维护性。在实际应用场景中,生成器函数作为创建迭代器的强大工具,通过yield关键字简化了状态管理,而异步迭代器与for await

weixin_34082789的博客 413
上一篇: 使用 vue3-tel-input电话组件时,为什么通过v-model绑定的默认值无效而 通过:value绑定有效?
下一篇: OpenJDK基准测试工具-JMH相关的所有注解
小鸡炖蘑菇Plus版
博客等级 码龄10年 10粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值