如何合并数组中的多个键值对对象?Node.js传EJS数据遇问题
问题排查与解决方案
核心问题分析
- Mongoose查询覆盖问题:连续调用
.select()会导致后一个覆盖前一个,你原本想获取相关字段,但第二个.select('username')会覆盖第一个,最终只查询username字段(默认还会包含_id)。 - 对象键重复覆盖:用
Object.assign将多个用户对象合并到同一个JSONobject中,由于对象的键名唯一,后续用户的username会直接覆盖前面的,最终只能得到最后一个用户的username。 - 错误的数据结构期望:你期望的结果里同一个对象包含多个相同键
username,这在JS对象中是不合法的,重复键会被自动覆盖,正确的结构应该是数组,每个元素为包含username的对象,或者直接是username字符串数组。
修正后的代码
方案1:传递用户名数组给EJS
User.find({}) .select('username -_id') // 合并select,只取username并排除_id .then(users => { // 提取所有username组成数组 const usernameList = users.map(user => user.username); console.log(usernameList); // 输出: ['user1@passport.com', 'user2@passport.com', ...] res.render("ToDo.ejs", { UserLIst: usernameList }); })
方案2:传递用户对象数组给EJS(保留对象结构)
User.find({}) .select('username -_id') .then(users => { console.log(users); // 输出: [{username: 'xxx'}, {username: 'xxx'}, ...] res.render("ToDo.ejs", { UserLIst: users }); })
EJS中使用数据的示例
如果用方案1的数组:
<ul> <% UserLIst.forEach(username => { %> <li><%= username %></li> <% }) %> </ul>
如果用方案2的对象数组:
<ul> <% UserLIst.forEach(user => { %> <li><%= user.username %></li> <% }) %> </ul>
内容的提问来源于stack exchange,提问作者Darren Jensen
相关产品推荐
相关产品推荐

