You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:50:34