Node.js中使用动态对象名更新数据库的技术问题
解决动态生成对象键名的问题
我正在爬取网页数据并将其存入数据库,需求是让存入的对象拥有动态生成的名称。在下方示例代码中,我希望变量URLString的值能成为底部对象的键名,但目前存入数据库的每个对象键名都是字符串'URLString',而非URLString变量的实际值。我查阅了相关资料但未找到解决方法,希望能得到帮助。
你的代码示例:
$('.live-update').each(function(i, element){ var homeTeamAbbr = $(this).find('tbody').children('tr').eq(0).find('a').html().split("alt/").pop().split('.svg')[0] var awayTeamAbbr = $(this).find('tbody').children('tr').eq(1).find('a').html().split("alt/").pop().split('.svg')[0] var homeTeam = $(this).find('tbody').children('tr').eq(0).find('a.team').text().trim(); var awayTeam = $(this).find('tbody').children('tr').eq(1).find('a.team').text().trim(); var gameTime = $(this).find('.pregame-date').text().trim() console.log(homeTeam + " @ " + awayTeam + ": " + gameTime) console.log(homeTeamAbbr + " @ " + awayTeamAbbr) var urlDate = moment().format('YYYYMMDD'); var URLString = "NBA_" + urlDate + "_" + awayTeamAbbr + "@" + homeTeamAbbr; var docRef = database.collection('Schedule').doc(urlDate).collection(URLString); var boxScoreURL = "www.cbssports.com/nba/gametracker/boxscore/" + URLString var objectNamed = URLString var setAda = docRef.add({URLString: { homeTeam: homeTeam, awayTeam: awayTeam, date: gameTime, homeTeamAbbr: homeTeamAbbr, awayTeamAbbr: awayTeamAbbr, boxScoreURL: boxScoreURL }}); });
问题原因
你遇到的问题是因为在JavaScript对象字面量中,直接写{URLString: ...}时,URLString会被当作字符串字面量作为键名,而不是解析成变量的值——这是JS对象字面量的默认行为。
两种解决方案
方案1:使用ES6计算属性名(推荐)
ES6引入了计算属性名的语法,你只需要把变量用方括号[]包裹起来,就能让JS把它解析成变量的值作为键名,写法非常简洁:
var setAda = docRef.add({ [URLString]: { homeTeam: homeTeam, awayTeam: awayTeam, date: gameTime, homeTeamAbbr: homeTeamAbbr, awayTeamAbbr: awayTeamAbbr, boxScoreURL: boxScoreURL } });
方案2:先创建对象再动态赋值
如果你的运行环境不支持ES6(现在绝大多数环境都支持了,这里仅作兼容参考),可以先创建一个空对象,再通过变量作为键来赋值:
// 先创建空对象 var gameData = {}; // 用变量作为键,把比赛数据赋值进去 gameData[URLString] = { homeTeam: homeTeam, awayTeam: awayTeam, date: gameTime, homeTeamAbbr: homeTeamAbbr, awayTeamAbbr: awayTeamAbbr, boxScoreURL: boxScoreURL }; // 存入数据库 var setAda = docRef.add(gameData);
这样修改后,存入数据库的对象键名就会是URLString变量的实际值(比如类似NBA_20240520_LAL@BOS这样的字符串),而不是固定的'URLString'了。
内容的提问来源于stack exchange,提问作者Louis Sankey
相关产品推荐
相关产品推荐

