javascript - 无循环地为数组中的每个对象赋值

标签 javascript arrays angularjs object angularjs-ng-repeat

我正在向 Angular 1 应用程序添加一个简单的评论组件。我从服务器获取的对象如下所示:

comments":[
        {"id":1,"content":"this is my first comment","approved":1,"replies":[]},
        {"id":2,"content":"this is the second","approved":1,"replies":[
          {"priority_id":0,"content":"content of a reply","approved":1},
          {"priority_id":0,"content":"content of a second reply","approved":1}]
        }
      ]

目前我在 Controller 中使用 2 个循环来为每个评论分配一个“待定”值并回复已批准:0

看起来像这样:

angular.forEach($scope.comments, function (comment) {
          if (comment.approved === 0) {
            comment.pending = true;
        }
          comment.replies = comment.replies || [];

          angular.forEach(comment.replies, function (reply) {
          if (reply.approved === 0) {
            reply.pending = true;
            }
          });
      });

有没有更好、更短的方法来获得它? Javascript 并不是我的强项。我真的需要在 Controller 中循环吗?也许我可以以某种方式传递 ng-repeat 的值?提前致谢!

感谢Joe我知道了一种比循环更好的方法。尽管我不得不稍微修改代码才能工作,但我已将他的回答标记为解决方案,因为我的应用程序使用与箭头功能不兼容的 Angular 1.4。这是代码:

$scope.comments.map(function(comment) {

                  if (comment.approved === 0) {
                    comment.pending = true;
                  }

                  comment.replies = comment.replies || [];

                  comment.replies.map(function(reply){
                     if (reply.approved === 0) {
                    reply.pending = true;
                    }
                    return reply.approved;
                  });
                  return comment.approved;

                });

它看起来不像 Joe 的那样整洁,但它仍然使用 map 方法,正如 Joe 和 Matthew 所建议的那样,它比循环更好。

最佳答案

所以不确定这是否更清晰或更简洁,但您可以利用数组上的 javascript .map 原型(prototype)。 map 函数的作用是遍历数组并根据提供的函数将每个值转换为新值。所以这实际上会返回一个从前一个数组映射而来的新对象数组。我不确定这是否真的更简单。您还可以利用 ES5 箭头函数。

还有一点: 在您当前的代码中,评论只有在 approved === 0 时才会获得 pending 字段。这意味着如果不等于 0,则评论中将不存在 pending 字段。如果你依赖这个字段,这可能会在以后导致奇怪的事情。有些人会说 pending 等于 true,而其他评论则未定义。您的回复也是如此。我下面的解决方案使用条件 AS 挂起字段,因此它存在于每个对象上,而不仅仅是真正的对象。

MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

$scope.comments.map(comment => {
    comment.pending = comment.approved === 0;
    comment.replies = (comment.replies || []).map(reply => {
        reply.pending = reply.approved === 0;
        return reply;
    });
    return comment;
})

关于javascript - 无循环地为数组中的每个对象赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50374038/

相关文章:

javascript - 使用 Jquery 插件 blueimp gallery 在灯箱中显示描述

c++ - CodeChef 的子序列等式

python - 如何很好地打印带有编号的列和行的数组(在Python中)?

javascript - 阻止浏览器获取 HTML 语法中的 AngularJS 属性

javascript - ng-repeat 不声明对象数组

javascript - javascript继承中的堆栈溢出

javascript - JQuery Mobile 动态添加的页面没有主题

java - 将 xml 转换为网格格式

php - sizeof 的错误结果

AngularJS - 服务器端 index.html 和身份验证