如何匹配数组目标项并增加对应voteCount值(电影投票场景)
实现方案
直接操作JSON文件的代码实现
首先修正你原代码的笔误:你调用movieListArr.map()生成的投票数组没有赋值给labelArr,直接写入JSON会报错,需要先把map结果赋值给写入用的变量。
以下是核心投票计数实现代码:
const fs = require('fs/promises'); // 用promise版本的fs更方便控制异步流程,也可以替换为同步版本 async function updateVoteCount(userVote) { try { // 1. 读取并解析本地JSON文件 const movieJsonContent = await fs.readFile('./movie.json', 'utf8'); const movieList = JSON.parse(movieJsonContent); // 2. 匹配用户投票的选项,更新计数 const targetMovie = movieList.find(item => item.value === userVote); if (!targetMovie) { console.log(`投票项${userVote}不存在`); return; } targetMovie.voteCount += 1; // 3. 把更新后的数据写回JSON文件 await fs.writeFile('./movie.json', JSON.stringify(movieList, null, 2)); console.log('投票计数更新成功'); } catch (err) { console.error('投票处理失败:', err); } } // 调用示例 const userVote = interaction.values[0]; updateVoteCount(userVote);
如果你需要同步处理逻辑,也可以使用同步读写版本:
const fs = require('fs'); const userVote = interaction.values[0]; try { const movieList = JSON.parse(fs.readFileSync('./movie.json', 'utf8')); const target = movieList.find(item => item.value === userVote); target && (target.voteCount += 1); fs.writeFileSync('./movie.json', JSON.stringify(movieList, null, 2)); } catch (err) { console.error(err); }
更优存储方案推荐
直接用JSON文件存储只适合极低并发、数据量极小的测试场景,实际使用会存在并发写入损坏文件、全量读写性能差、无事务保障容易丢数据的问题,推荐根据业务场景选择替代方案:
- 小型单服务项目:选择SQLite,文件型轻量数据库,不需要单独运行服务进程,支持SQL查询和事务,写入安全,性能远高于JSON文件。
- 中高频投票场景:选择Redis,内存型数据库,读写速度极快,原生支持计数原子操作,不用担心并发冲突问题,也可以配置持久化防止数据丢失。
- 后续需要扩展投票用户校验、多场次投票等复杂功能:选择MySQL、MongoDB这类通用数据库,可以灵活支持各类业务扩展。
内容的提问来源于stack exchange,提问作者justsurvivinglol
相关产品推荐
相关产品推荐

