JavaScript中匹配数组奖项名称并修改awarded属性的实现方法
解决方案
嘿,这个需求其实很好实现,我给你两种实用的方案,你可以根据自己的场景来选:
方案一:直接修改原数组(高效推荐)
首先,我们可以先把array2里的所有奖项名称提取出来存到一个Set里——因为Set的查找速度非常快,比每次遍历array2去匹配要高效得多,尤其是当数组元素比较多的时候。
然后遍历array1,检查每个奖项的名称是否在这个Set里,如果存在,就把对应的awarded属性改成true。
完整代码示例:
// 你的原始奖项数组 const array1 = [ { "finished": 1, "awardName": "The beginning", "description": "Complete one excersise", "difficulty": "easy", "awarded": false }, { "finished": 5, "awardName": "Five of a kind", "description": "Complete five excersises", "difficulty": "medium", "awarded": false }, // 其他奖项... ]; // 已授予的奖项数组 const array2 = [ { "award": "Five of a kind" }, { "award": "The beginning" }, { "award": "firstTimeLogin" } ]; // 把已授予的奖项名称提取到Set中 const awardedAwardNames = new Set(array2.map(item => item.award)); // 遍历更新array1的awarded属性 array1.forEach(award => { if (awardedAwardNames.has(award.awardName)) { award.awarded = true; } }); // 打印结果看看 console.log(array1);
运行这段代码后,array1里的"The beginning"和"Five of a kind"对应的awarded都会变成true,而"firstTimeLogin"因为不在array1里,所以不会产生任何影响。
方案二:返回新数组(不修改原数据)
如果你不想改动原来的array1,而是希望得到一个新的数组,可以用map方法来创建新对象:
const awardedAwardNames = new Set(array2.map(item => item.award)); // 生成新数组,不修改原array1 const updatedArray1 = array1.map(award => ({ // 复制原对象的所有属性 ...award, // 重新设置awarded属性 awarded: awardedAwardNames.has(award.awardName) })); console.log(updatedArray1);
这个方案会返回一个全新的数组,原array1的内容不会被改变,适合需要保留原始数据的场景。
内容的提问来源于stack exchange,提问作者petar11199
相关产品推荐
相关产品推荐

