JavaScript中已知唯一键值对,可否不用find直接修改数组内对象属性?
问题解答
原生数组的底层限制
JavaScript的普通数组是线性存储结构,没有内置的属性值到对应对象的映射索引,所以只要你是从数组中获取匹配指定key:value的对象,本质上都要执行遍历操作,不存在完全跳过遍历的实现方案。
你常用的Array.find()本身就是封装了遍历逻辑的语法糖,和你手写for循环逐个匹配id的底层逻辑是完全一致的,只是写法更简洁。
实现简写语法的方案
目前JavaScript没有原生支持你示例中testObj.id['001'].first这种直接按属性值索引数组元素的语法,但是你可以提前把数组转换为索引结构(Map或者普通对象),后续就可以直接按键取值修改,不需要重复遍历:
方案1:用Map做索引
// 仅需遍历一次数组,生成以id为键的Map const testMap = new Map(testObj.map(item => [item.id, item])) // 后续直接取值修改,不需要再遍历 testMap.get('001').first = 'something'
方案2:用普通对象做索引
// 生成以id为键的索引对象 const testIndex = Object.fromEntries(testObj.map(item => [item.id, item])) // 直接按键取值修改 testIndex['001'].first = 'something'
适用场景说明
- 这种转索引的操作本身需要遍历一次数组,适合后续需要多次根据id查询、修改对象的场景,如果仅需要查询修改一次,开销和直接用
find没有差异 - 如果原数组会动态增删元素,需要同步更新你维护的索引结构,否则会出现数据不一致的问题
- 如果你不想额外维护索引结构,就只能用
find或者手写遍历的方式获取目标对象再修改属性
内容的提问来源于stack exchange,提问作者kalmdown
相关产品推荐
相关产品推荐

