Javascript 为不带循环的数组中的每个对象指定一个值
我在angular 1应用程序中添加了一个简单的注释组件。我从服务器获取的对象如下所示: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
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想要更少的代码还是没有循环。谢谢你的投票!