如何根据条件过滤原数组并生成新数据结构的键值对集合?
解决方案
你可以结合数组方法同时完成过滤和结构转换,这里提供两种常用实现方式:
方法一:用reduce一步完成(高效简洁)
reduce能在遍历数组的同时完成过滤与对象构建,无需额外中间数组:
const users = [ {id: 1, name: 'userOne', age: 23, licenseNumber: '95273380'}, {id: 2, name: 'userTwo', age: 21, licenseNumber: '95273381'}, {id: 3, name: 'userThree', age: 18, licenseNumber: ''}, {id: 4, name: 'userFour', age: 2, licenseNumber: '95273382'}, {id: 5, name: 'userFive', age: 77, licenseNumber: null}, {id: 6, name: 'userSix', age: 35, licenseNumber: '95273383'}, ]; const licenseToName = users.reduce((acc, user) => { // 过滤掉licenseNumber为空字符串或null的用户 if (user.licenseNumber !== '' && user.licenseNumber !== null) { acc[user.licenseNumber] = user.name; } return acc; }, {}); console.log(licenseToName); // 输出: // { // '95273380': 'userOne', // '95273381': 'userTwo', // '95273382': 'userFour', // '95273383': 'userSix' // }
方法二:filter + Object.fromEntries(可读性更强)
先通过filter筛选有效用户,再用map转成[键, 值]格式的数组,最后用Object.fromEntries生成目标对象:
const validUsers = users.filter(user => user.licenseNumber !== '' && user.licenseNumber !== null ); const licenseToName = Object.fromEntries( validUsers.map(user => [user.licenseNumber, user.name]) ); console.log(licenseToName); // 输出与上面一致
关键说明
- 两种方法都能满足需求:先过滤无效数据,再构建键值对结构
reduce仅遍历数组一次,性能更优;filter+map逻辑拆分清晰,新手更容易理解- 过滤条件明确判断
!== ''和!== null,避免误过滤其他假值(比如0或undefined,如果数据集存在这类情况)
内容的提问来源于stack exchange,提问作者KaraX_X
相关产品推荐
相关产品推荐

