Javascript 为不带循环的数组中的每个对象指定一个值

Javascript 为不带循环的数组中的每个对象指定一个值,javascript,arrays,angularjs,object,angularjs-ng-repeat,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":"co

我在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}]
        }
      ]
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;
            }
          });
      });
目前,我正在控制器中使用2个循环为每个评论和已批准的回复分配一个“待定”值:0

看起来是这样的:

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}]
        }
      ]
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并不是我的强项。我真的需要在控制器中循环吗?也许我可以通过某种方式传递ng repeat的值?提前谢谢

多亏了我知道了一个比循环更好的方法。我已经将他的答案标记为解决方案,尽管我必须修改代码才能工作,因为我的应用程序使用angular 1.4,它与arrow函数不兼容。代码如下:

$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所建议的,map方法比循环好

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

还有一件事: 在当前代码中,如果已批准==0,则注释仅获取挂起字段。这意味着如果不等于0,则注释中将不存在待定字段。如果你依赖这个领域,这可能会导致以后发生奇怪的事情。有些人会说pending等于true,而其他评论则没有定义。你的回复也是如此。我下面的解决方案使用条件作为挂起字段,因此它存在于每个对象上,而不仅仅是真正的对象

MDN:


您可以编写一个函数,将该键添加到对象中。使用此函数,您的循环将如下所示:

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}]
        }
      ]
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;
            }
          });
      });
let注释=[{
“id”:1,
“内容”:“这是我的第一条评论”,
“批准”:1,
“答复”:[]
}, {
“id”:2,
“内容”:“这是第二次”,
“批准”:1,
“答复”:[{
“优先级id”:0,
“内容”:“回复内容”,
“批准”:1
},
{
“优先级id”:0,
“内容”:“第二次答复的内容”,
“批准”:1
}
]
}, {
“id”:3,
“内容”:“这是第三次”,
“已批准”:0,
“答复”:[{
“优先级id”:0,
“内容”:“回复内容”,
“已批准”:0
},
{
“优先级id”:0,
“内容”:“第二次答复的内容”,
“已批准”:0
}
]
}];
函数AddPending(obj){
obj['pending']=true;
返回obj;
}
comments.forEach(函数(comment){
comment=(comment.hasOwnProperty('approved')&&comment.approved==0)?AddPending(comment):comment;
comment.replays=comment.replays | |[];
comment.replays.forEach(函数(reply){
reply=(reply.approved==0)?AddPending(reply):reply;
});
});

控制台日志(注释)使用诸如map之类的函数缩短代码通常会使函数更简洁、更易于阅读。我已经投了赞成票。这是我的想法,但我不确定OP想要更少的代码还是没有循环。谢谢你的投票!