Flutter中基于Dart对比两个列表的UID并生成第三个列表的实现方法
嘿,这个需求在日常开发里真的挺常见的,我给你整理几种不同场景下的实现方式,你可以根据自己的技术栈来选~
核心思路
其实本质就是通过uid建立两个列表的关联,为了提升效率,咱们可以先把List2的uid转换成一个集合(Set),这样判断uid是否存在的速度会快很多,然后遍历List1筛选出符合条件的用户就行。
前端场景(JavaScript/React/Vue等)
如果是在前端处理已经获取到的两个列表,直接用数组的filter方法结合Set就搞定了:
// 假设这是从Firebase获取到的List1(完整用户信息) const fullUserList = [ { uid: 'user_001', name: 'Alice', email: 'alice@example.com', age: 26 }, { uid: 'user_002', name: 'Bob', email: 'bob@example.com', age: 32 }, { uid: 'user_003', name: 'Charlie', email: 'charlie@example.com', age: 29 } ]; // 这是从Firebase获取到的List2(目标uid列表) const targetUids = ['user_001', 'user_003']; // 把目标uid转成Set,提升查找性能(数据量大的时候效果明显) const uidSet = new Set(targetUids); // 筛选出List1中uid在Set里的用户 const targetUsers = fullUserList.filter(user => uidSet.has(user.uid)); console.log(targetUsers); // 输出结果就是包含Alice和Charlie完整信息的数组
为什么用Set?因为数组的includes方法是O(n)时间复杂度,而Set的has是O(1),当目标uid数量很多时,性能差异会非常大。
后端场景(Firebase Admin SDK)
如果是在Node.js后端处理,除了上面的筛选方法,咱们还可以直接在数据库层面做筛选,这样能避免拉取全部用户数据,更省带宽和资源:
方法1:直接数据库筛选(推荐,数据量小时用)
Firestore支持whereIn查询(注意:最多支持10个参数),可以直接查询出目标uid对应的用户:
const admin = require('firebase-admin'); admin.initializeApp(); async function getTargetUsers() { // 假设List2是咱们拿到的目标uid数组 const targetUids = ['user_001', 'user_003']; // 直接查询符合条件的用户 const snapshot = await admin.firestore() .collection('users') .where(admin.firestore.FieldPath.documentId(), 'in', targetUids) .get(); // 把查询结果转换成用户对象数组 const targetUsers = snapshot.docs.map(doc => ({ uid: doc.id, ...doc.data() })); return targetUsers; } // 调用函数 getTargetUsers() .then(users => console.log('目标用户:', users)) .catch(err => console.error('查询出错:', err));
方法2:先拉取全部用户再筛选(数据量不大时用)
如果目标uid数量超过10个,或者你需要先处理全部用户数据,可以用前端的筛选逻辑:
async function getTargetUsers() { // 拉取所有用户数据(List1) const allUsersSnapshot = await admin.firestore().collection('users').get(); const fullUserList = allUsersSnapshot.docs.map(doc => ({ uid: doc.id, ...doc.data() })); // 假设这是List2的目标uid数组 const targetUids = ['user_001', 'user_003', /* 更多uid... */]; const uidSet = new Set(targetUids); // 筛选目标用户 const targetUsers = fullUserList.filter(user => uidSet.has(user.uid)); return targetUsers; }
处理超过10个uid的情况
如果目标uid数量超过10个,咱们可以把uid数组分成多个子数组(每个最多10个),分别查询后合并结果:
function chunkArray(arr, chunkSize) { const chunks = []; for (let i = 0; i < arr.length; i += chunkSize) { chunks.push(arr.slice(i, i + chunkSize)); } return chunks; } async function getTargetUsers() { const targetUids = ['user_001', 'user_003', /* ... 超过10个uid */]; const uidChunks = chunkArray(targetUids, 10); // 批量查询每个chunk的用户 const userChunks = await Promise.all( uidChunks.map(chunk => admin.firestore() .collection('users') .where(admin.firestore.FieldPath.documentId(), 'in', chunk) .get() .then(snapshot => snapshot.docs.map(doc => ({ uid: doc.id, ...doc.data() }))) ) ); // 合并所有chunk的结果 return userChunks.flat(); }
Firebase Realtime Database 场景
如果你用的是Realtime Database,也可以类似处理:
// 直接批量查询目标uid的用户 const targetUids = ['user_001', 'user_003']; const db = admin.database(); db.ref('users') .orderByKey() .in(targetUids) .once('value') .then(snapshot => { const targetUsers = []; snapshot.forEach(childSnap => { targetUsers.push({ uid: childSnap.key, ...childSnap.val() }); }); console.log(targetUsers); });
Realtime Database的in查询最多支持100个参数,比Firestore宽松一些。
内容的提问来源于stack exchange,提问作者DholaSain
相关产品推荐
相关产品推荐

