如何用.map实现数组去重(移除另一数组存在值)及对象属性筛选
嘿,我来帮你搞定这两个问题,针对每个需求我都给出符合要求的实现方案,直接上代码和解释:
1. 从第一个数组移除所有存在于第二个数组中的值
这个需求最直观的实现是用Array.filter(),它就是专门用来筛选数组元素的:
const arr1 = [1, 2, 3, 4, 5]; const arr2 = [2, 4]; // 过滤出arr1中不在arr2里的元素 const filteredArray = arr1.filter(item => !arr2.includes(item)); console.log(filteredArray); // 输出: [1, 3, 5]
如果你一定需要用map(虽然filter更贴合这个筛选场景),可以先通过map标记需要保留的元素,再过滤掉无效项:
const filteredArrayWithMap = arr1 .map(item => arr2.includes(item) ? undefined : item) .filter(Boolean); console.log(filteredArrayWithMap); // 输出: [1, 3, 5]
解释:map会遍历每个元素,不在arr2里的保留原值,在里面的返回undefined,最后用filter(Boolean)把undefined过滤掉,得到最终的筛选数组。
2. 创建新对象以剔除第二个对象中缺失的属性(必须用map,禁止普通循环)
因为对象本身不能直接用map,我们可以先把对象的键转换成数组,再借助map处理,最后转回对象:
const originalObj = { name: "john", age: 25, city: "New York" }; const referenceObj = { name: "jane" }; // 参考对象,只保留它含有的属性 // 用map处理键数组,筛选出referenceObj中存在的键值对 const filteredObj = Object.fromEntries( Object.keys(originalObj).map(key => { if (referenceObj.hasOwnProperty(key)) { return [key, originalObj[key]]; } // 对于referenceObj没有的键,返回undefined,后续会被过滤 }).filter(Boolean) ); console.log(filteredObj); // 输出: { name: "john" }
解释:
Object.keys(originalObj)把原始对象的键转成数组,比如["name", "age", "city"]map遍历每个键,判断参考对象是否包含该键,有就返回[键, 值]的数组,没有则返回undefinedfilter(Boolean)过滤掉undefined的无效项Object.fromEntries()把处理后的键值对数组转回对象,得到最终筛选结果
内容的提问来源于stack exchange,提问作者AmazingDayToday
相关产品推荐
相关产品推荐

