如何更新/赋值map对象?如何遍历对象数组生成预期新对象?
两个JavaScript问题的解决方案
1. 如何对Map对象执行更新或赋值操作?
其实Map对象本身就提供了专门的方法来处理赋值和更新——set()方法。它的逻辑很简单:如果你传入的键在Map里不存在,就会新增这个键值对;如果键已经存在,就会覆盖掉原来的值。
举几个实用的例子:
// 先创建一个空Map const userMap = new Map(); // 给Map添加新的键值对(赋值) userMap.set('username', 'johndoe'); console.log(userMap.get('username')); // 输出: johndoe // 更新已存在的键对应的值 userMap.set('username', 'janedoe'); console.log(userMap.get('username')); // 输出: janedoe // 还可以链式调用set,一次性添加多个键值对 userMap.set('age', 30).set('location', 'London');
如果需要批量给Map赋值或更新,可以结合循环来做:
const batchData = [['theme', 'dark'], ['fontSize', 16], ['notifications', true]]; const settingsMap = new Map(); batchData.forEach(([key, value]) => { settingsMap.set(key, value); });
2. 遍历嵌套对象数组创建新对象的正确写法
先帮你分析下原来代码的问题:
- 你的
map回调函数没有返回值,所以最终props会是一个全是undefined的数组 - 直接尝试修改
props.data.bd.locale会报错,因为初始的props是空对象{},props.data根本不存在,更别说嵌套的bd.locale了 - 看起来你可能混淆了
map的用途(它是用来生成新数组的)和你想要创建单个新对象的需求?
情况1:想要生成一个包含嵌套结构的单个新对象
如果你的目标是把数组里的所有元素整合到一个新对象的bd.locale下,推荐用reduce方法(它专门用来累积生成单个值/对象)。假设你的datas是类似这样的数组:
const datas = [ { lang: 'en', label: 'English' }, { lang: 'zh-CN', label: '简体中文' } ];
对应的正确写法:
const result = datas.reduce((acc, data) => { // 先初始化嵌套结构,避免找不到属性的报错 if (!acc.bd) acc.bd = {}; if (!acc.bd.locale) acc.bd.locale = {}; // 把当前元素的内容映射到locale下,这里用data.lang作为键 acc.bd.locale[data.lang] = data.label; return acc; }, {}); // 初始值是空对象 console.log(result); // 输出: { bd: { locale: { en: 'English', 'zh-CN': '简体中文' } } }
情况2:想要生成一个数组,每个元素是包含bd.locale的新对象
如果你其实是想给数组里的每个元素都生成一个带bd.locale结构的对象,那修正map的写法即可:
const propsArray = datas.map(data => { // 每个迭代都返回一个全新的对象 return { bd: { locale: data } }; }); console.log(propsArray); // 输出: [ { bd: { locale: datas[0] } }, { bd: { locale: datas[1] } } ]
原来的代码之所以跑不起来,核心是你在map里没有返回值,还试图修改一个未初始化的嵌套属性,这两个问题都解决后就能正常工作啦。
内容的提问来源于stack exchange,提问作者3gwebtrain
相关产品推荐
相关产品推荐

