【问题标题】:Append inner objects in multi-dimensional array with a loop使用循环将内部对象附加到多维数组中
【发布时间】:2016-02-03 01:10:01
【问题描述】:

我有一个评论对象的多维数组,我想出了如何循环遍历第一级对象然后附加它们,但是我很难弄清楚如何将回复与有回复的 cmets。我的策略是使用“if”语句检查是否有回复,然后像我做 cmets 一样遍历回复,但我认为最接近的()函数是问题所在,我不太确定如何访问与该注释对应的 DOM 元素以将其用作选择器。我认为也许另一种策略是使用一个 .each 循环与 cmets 同时处理回复。任何帮助将不胜感激!

        var myCommentArray = [
        {
            _id: "888888888888888888",
            index: 1,
            name: "Perez",
            message: "First Comment .......",
            subject: "enim officias",
            replies: [ // notice this comment has replies (just 1 but it is still an array)
              {
                  _id: "77777777777777777777",
                  index: 0,
                  name: "Reply to First Comment Ines for Perez",
                  message: "...",
                  subject: "reply subject consequat"
              }
            ]
        },
              {
                  _id: "999999999999",
                  index: 0,
                  name: "Shelton",
                  message: "2nd Comment....a",
                  subject: "enim irure",
                  replies: null // notice this comment has no replies and as such is null. this is better than an empty array
              },
              {
                  _id: "666666666666666666",
                  index: 2,
                  name: "Perez",
                  message: "3rd Comment.......",
                  subject: "enim officias",
                  replies: [
                    {
                        _id: "55555555555555555555",
                        index: 0,
                        name: "1st Reply to 3rd Comment",
                        message: "...",
                        subject: "reply subject consequat"
                    },
                     {
                         _id: "44444444444444444444",
                         index: 1,
                         name: "2nd Reply to 3rd Comment",
                         message: "...",
                         subject: "reply subject consequat"
                     }
                  ]
              }
            ];


        sabio.page.processComments = function (i, currentComment) {
            var commentsFormat = '<br> <div class="comment-avatar media-left"> <img src="http://placehold.it/50x50" alt="avatar">' +
           '</div><div class="comment-content media-body clearfix"> <div class="comment-avatar media-left"></div><h3 class="media-heading">' +
           currentComment.subject + '</h3> <div class="comment-meta">By ' + currentComment.name + '</div> <div class="comment-body"> <p>'
           + currentComment.message + '</p><a href="#" class="replyButton">' +
           '<i class="fa fa-reply"> </i> Reply </a> </div> </div>';

            $('.comments').append(commentsFormat);

         };

        $.each(myCommentArray, sabio.page.processComments);

    sabio.page.processReplies = function (j, currentComment) {
    var repliesFormat = '<br> <div class="comment-avatar media-left"> <img src="http://placehold.it/50x50" alt="avatar">' +
      '</div><div class="comment-content media-body clearfix"> <div class="comment-avatar media-left"></div><h3 class="media-heading">' + currentComment.subject + '</h3> <div class="comment-meta">By ' +      currentComment.name + '</div> <div class="comment-body"> <p>' +           currentComment.message + '</p><a href="#" class="btn btn-gray more  reply">' +
      '<i class="fa fa-reply"> </i> Reply </a> </div> </div>';



   var closestComment= $(currentComment).closest();


  $(closestComment).append(repliesFormat);
    });

    if (myCommentArray.replies) {

      $.each(myCommentArray.replies, sabio.page.processReplies);
  };

【问题讨论】:

  • 为什么你认为null[] 更能代表无回复?

标签: javascript jquery arrays loops append


【解决方案1】:

这里肯定对 jQuery 的 .closest 作为参数存在一些误解,并且 currentComment 存在一些奇怪的范围错误。但是,要解决的主要问题是,如果 replies 是每个评论对象的属性,那么您将需要处理每个评论项的回复 - 也就是说,处理回复的代码应该由 @987654325 以某种方式处理@函数。

话虽如此,我会向您提出我认为对您的问题更好的解决方案。因为您正在尝试从 cmets 数组呈现 HTML,所以我认为更简洁和优雅的解决方案是使用 JavaScript 模板。我将使用 Underscore.js 库中的 .template 方法:

<script id="CommentsTemplate" type="text/template">
    <div>
        <% _.each(comments, function (comment) { %>
            <div class="comment-avatar media-left">
                <img src="http://placehold.it/50x50" alt="avatar" />
            </div>
            <div class="comment-content media-body clearfix">
                <div class="comment-avatar media-left"></div>
                <h3 class="media-heading"><%- comment.subject %></h3>
                <div class="comment-meta">By <%- comment.name %></div>
                <div class="comment-body">
                    <p><%- comment.message %></p>
                    <a href="#" class="replyButton"><i class="fa fa-reply"> </i> Reply</a>
                </div>
            </div>
            <div>
                <% _.each(comment.replies, function (reply) { %>
                    <div class="comment-avatar media-left">
                        <img src="http://placehold.it/50x50" alt="avatar" />
                    </div>
                    <div class="comment-content media-body clearfix">
                        <div class="comment-avatar media-left"></div>
                        <h3 class="media-heading"><%- reply.subject %></h3>
                        <div class="comment-meta">By <%- reply.name %></div>
                        <div class="comment-body">
                            <p><%- reply.message %></p>
                            <a href="#" class="btn btn-gray more reply"><i class="fa fa-reply"> </i> Reply</a>
                        </div>
                    </div>
                <% }); %>
            </div>
        <% }); %>
    </div>
</script>

有了我们的模板,我们的渲染可以简化为一些非常简单的代码:

var template = _.template($('#CommentsTemplate').html());
$('.comments').html(template({ comments: comments }));

【讨论】:

  • 好吧,太好了,我一定会去研究 JavaScript 模板,我只是在学习,而且只做了大约六周...我希望有一天像你一样伟大...我喜欢您将范围错误称为“好奇”,而不仅仅是说它是错误的!我肯定会使用您更优雅的代码,但是如果您有时间请解释一下 currentComment 的错误应该是 myCommentArray[i].subject 吗?
  • 是的,要访问myCommentArray 中的对象,您必须按索引进行操作(如myCommentArray[0])。 myCommentsArray.replies 不正确,因为 myCommentsArray 的每个元素都具有 replies 属性,而不是数组本身。此外,var closestComment= $(currentComment).closest(); 不会起作用,因为您希望将 DOM 元素或选择器传递给 jQuery 方法,而不是普通对象。
猜你喜欢
  • 2011-10-17
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 2016-03-18
  • 2020-08-27
  • 2019-11-21
  • 1970-01-01
  • 2021-05-04
相关资源
最近更新 更多