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

如何合并数组中的多个键值对对象?Node.js传EJS数据遇问题

问题排查与解决方案

核心问题分析

  1. Mongoose查询覆盖问题:连续调用.select()会导致后一个覆盖前一个,你原本想获取相关字段,但第二个.select('username')会覆盖第一个,最终只查询username字段(默认还会包含_id)。
  2. 对象键重复覆盖:用Object.assign将多个用户对象合并到同一个JSONobject中,由于对象的键名唯一,后续用户的username会直接覆盖前面的,最终只能得到最后一个用户的username。
  3. 错误的数据结构期望:你期望的结果里同一个对象包含多个相同键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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:28:28