【问题标题】:How to iterate through objects within array in Lodash如何在 Lodash 中遍历数组中的对象
【发布时间】:2016-01-05 17:44:57
【问题描述】:

我正在尝试在 HTML 模板中使用 lodash 来处理 Node.js 中的电子邮件。我有一个包含多个对象的数组。我想遍历每个对象并列出所有重复值。当我使用下面的代码时,我收到一条错误消息,指出该值未定义(例如,ReferenceError: firstName is not defined)。 HTML 模板位于单独的文件中。

对我做错了什么有什么想法吗?

Javascript:

var template = fs.readFileSync('server/views/email-template.html').toString();
var htmlAll = _.template(template)(orderInfo);

HTML:

<% _.forEach(function(firstName) { %><%- firstName %></td><% }); %> <% _.forEach(function(lastName) { %><%- lastName %></td><% }); %>
<% _.forEach(function(address) { %><%- address %></td><% });%>
<% _.forEach(function(city) { %><%- city %><% }); %>, <% _.forEach(function(state.code) { %><%- state.code %><% });
%> <% _.forEach(function(zip) { %><%- zip %><% }); %>

<% _.forEach(function(item) { %><td><%- item %></td><% }); %>
<% _.forEach(function(cost) { %><td><%- cost %></td><% }); %>

数组:

[
  {
    "firstName": "John",
    "lastName": "Doe",
    "address": "123 Broadway",
    "city": "New York",
    "state": {
      "code": "NY",
      "state": "New York"
    },
    "zip": "10001",
  },

  {
    "color": "White",
    "size": "M",   
    "item": "T-Shirt",
    "cost": 19.99,
  },
  {
    "color": "Blue",
    "size": "L",   
    "item": "T-Shirt",
    "cost": 19.99,
  }
]

【问题讨论】:

  • 这些模板是 EJS 吗?如果是这样,请相应地标记您的问题。
  • @m01 不,这只是 underscore.js 模板

标签: node.js underscore.js lodash


【解决方案1】:

实际上这里有几件事是错误的。从模板语法开始,您只需要在模板中指定要 foreach 的迭代器,但我们需要数据和迭代器,如下所示

_.forEach(users, function(user){

此外,您在单个数组位置有多个对象,所以我也稍微更新了 json 结构。

在像这样的小更新模板之后故意丢失了一些属性,

var tmpl = _.template('<ul><% _.forEach(users, function(user) { %><li><%- user.firstName %></li><li><%- user.address %></li><li><%- user.state.code %></li><li><%- user.state.state %></li><ol> <% _.forEach(user.orders, function(order) { %> <li><span><%- order.item %><span> cost is: <span><%- order.cost %><span></li> <% }); %> </ol> <% }); %></ul>');

同一个对象中带有orders数组的json如下

var data = { 'users': 

        [
  {
    "firstName": "John",
    "lastName": "Doe",
    "address": "123 Broadway",
    "city": "New York",
    "state": {
      "code": "NY",
      "state": "New York"
    },
    "zip": "10001",
    "orders": [
        {
            "color": "White",
            "size": "M",   
            "item": "T-Shirt",
            "cost": 19.99,
        },
        {
            "color": "Blue",
            "size": "L",   
            "item": "Pant",
            "cost": 19.99,
        }
  ]  
  } 
]
};

你可以在JSBIN看到它正在工作

【讨论】:

  • 是否需要更改 json 结构才能使其正常工作?
  • 不,不是,但我不确定如何在单个数组位置拥有多个对象,如果可能的话,我会很高兴知道。您可以做的另一件事是创建一个包含命名对象的大对象,但您永远不知道单个订单可以包含多少个对象
【解决方案2】:

您也可以在 ES6 箭头函数样式中执行此操作:

const users = ['Jack', 'Jill']; _.forEach(users, user => {console.log(user);});

【讨论】:

    【解决方案3】:

    这是因为您将orderInfo[0] 提供给您的模板。在您的数组中,orderInfo[0] 就是这一部分:

    {
        "firstName": "John",
        "lastName": "Doe",
        "address": "123 Broadway",
        "city": "New York",
        "state": {
          "code": "NY",
          "state": "New York"
        },
        "zip": "10001",
    }
    

    因此模板无法迭代缺失值。

    【讨论】:

    • 感谢您指出这一点。但我也一定做错了什么。因为当我删除 [0] 时,项目和成本值不会显示任何内容。
    • 如果您删除 tne [0],您会将整个数组提供给您的模板,因此您必须更改您的模板
    • 我已经更新了我的模板,但我仍然无法遍历并获取相应的值。有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2021-02-25
    • 2015-10-17
    • 1970-01-01
    相关资源
    最近更新 更多