JS如何解析引用外部数据的对象数组?map方法是否为最优选择?
问题根因
- 你的map回调返回全是
true,是因为使用了逗号运算符,逗号运算符只会返回最后一个表达式的执行结果,你最后一个表达式是item.isActive = foo,赋值操作的返回值就是赋的布尔值true,因此最终输出数组全为true。 - 原始
itemList定义存在语法错误:bar是数组类型,bar.a、bar.c是读取对象的自定义属性,数组本身不存在a、c属性,这两个字段实际拿到的是undefined,无法匹配到你要的'a'、'c'值。 - 三元表达式
foo ? true : false属于冗余写法,foo本身就是布尔值,直接使用即可。
实现方案
常规数据量场景
map是可读性和性能平衡的最优选择,只要你在回调里返回构造好的新对象即可,不会修改原数组,副作用更小:
const foo = true; const bar = ["a", "b", "c"]; // 修正原itemList的字段定义,这里用passwordIndex存对应bar的索引,如果你是存值匹配可以替换为对应字段 const itemList = [ { login: 'name', passwordIndex: 0, isActive: foo, }, { login: 'name2', passwordIndex: 2, isActive: foo, }, { login: 'name3', passwordIndex: 1, isActive: foo, } ]; const result = itemList.map(item => ({ login: item.login, password: bar[item.passwordIndex], isActive: item.isActive }));
超大数据量场景
如果你的数组条目达到十万级以上:
- 不需要生成新数组的话,直接用基础
for循环原地修改对象,性能比map高15%~30%左右,省掉了新数组创建的开销。 - 如果需要通过值匹配找
bar里的对应内容,不要在循环里反复调用indexOf(indexOf本身是O(n)遍历,会让整体时间复杂度升到O(n*m)),提前把bar转成值到索引的映射表,把查询复杂度降到O(1):
// 提前构建映射,只需要遍历一次bar const barValueMap = new Map(bar.map((value, index) => [value, index])); const result = []; // 用普通for循环遍历,性能最优 for (let i = 0; i < itemList.length; i++) { const item = itemList[i]; result.push({ login: item.login, password: bar[barValueMap.get(item.password)], isActive: foo }); }
内容的提问来源于stack exchange,提问作者Wordpressor
相关产品推荐
相关产品推荐

