如何通过for循环将SQLite查询返回的多组数组合并为单个数组
如何将SQLite多次循环查询的结果合并为单一对象数组
最优方案:使用IN子句一次性查询
没必要循环执行多次SELECT,这会增加数据库交互开销。直接用IN子句一次性查询所有目标dataID,然后将结果统一整理到一个数组中:
db.transaction(tx => { // 将emparray转换为适合IN子句的参数数组 const ids = emparray.map(id => id.toString()); // 构造匹配参数数量的占位符字符串 const placeholders = ids.map(() => '?').join(','); tx.executeSql( `SELECT * FROM database WHERE dataID IN (${placeholders})`, ids, (tx, res) => { const mergedResults = []; for (let i = 0; i < res.rows.length; i++) { mergedResults.push(res.rows.item(i)); } console.log(mergedResults); // 输出合并后的完整数组 } ); });
若需保留循环查询:收集结果并处理异步
如果因业务限制必须循环执行查询,可在外层定义数组收集所有结果,同时用Promise处理异步完成后的统一输出:
// 外层定义用于收集所有结果的数组 const mergedResults = []; // 用Promise数组跟踪所有异步查询 const queryPromises = []; db.transaction(tx => { for (let j = 0; j < emparray.length; j++) { const queryPromise = new Promise((resolve) => { tx.executeSql( `SELECT * FROM database WHERE dataID =?`, [emparray[j].toString()], (tx, res) => { const temp = []; for (let i = 0; i < res.rows.length; i++) { temp.push(res.rows.item(i)); } // 将当前查询结果合并到总数组 mergedResults.push(...temp); resolve(); } ); }); queryPromises.push(queryPromise); } }); // 等待所有查询完成后输出最终合并结果 Promise.all(queryPromises).then(() => { console.log(mergedResults); });
说明:第一种方案效率更高,减少了数据库交互次数,推荐优先使用;第二种方案适用于必须循环查询的场景,通过Promise.all确保所有异步操作完成后再输出结果。
内容的提问来源于stack exchange,提问作者anu
相关产品推荐
相关产品推荐

