Javascript 把手数组长度条件辅助对象
我有一个场景,在这个场景中,我试图创建一个自定义的Handlebar辅助对象,它查看数组的长度,如果该数组中存在三个以上的对象,则只返回前三个元素,如果不存在,则返回全部元素。下面是我的尝试,当我为Javascript 把手数组长度条件辅助对象,javascript,arrays,handlebars.js,Javascript,Arrays,Handlebars.js,我有一个场景,在这个场景中,我试图创建一个自定义的Handlebar辅助对象,它查看数组的长度,如果该数组中存在三个以上的对象,则只返回前三个元素,如果不存在,则返回全部元素。下面是我的尝试,当我为limitAmount传入一个值时,我得到了正确数量的对象,但是返回的值是[object SequelizeInstance:blog_comment],表示存在的对象数量。这不是我想要的,我现在想知道是否应该使用for循环来传回对象的值。这是简单地用for循环解决的吗 显示内容的详细示例: [obj
limitAmount
传入一个值时,我得到了正确数量的对象,但是返回的值是[object SequelizeInstance:blog_comment]
,表示存在的对象数量。这不是我想要的,我现在想知道是否应该使用for循环来传回对象的值。这是简单地用for循环解决的吗
显示内容的详细示例:
[object SequelizeInstance:blog_comment],[object SequelizeInstance:blog_comment],[object SequelizeInstance:blog_comment]
blog_comments: [
{
commentId: 1,
comment: 'Test',
userId: 2},
{
commentId:2,
comment: '2nd Test',
userId: 1
}]
hbs.registerHelper('commentLimit', function(comment, limitAmount, options){
if(comment.length > limitAmount){
return comment.slice(0,limitAmount);
} else {
return comment;
}
})
{{#commentLimit blog_comments 2}}
{{#ifeq userId @root.user.userId}}
<a href="#" class="comment-delete" data-comment-id="{{commentId}}">Delete</a></p>
{{/ifeq}}
<p class="blog-comment">{{comment}}</p>
{{/commentLimit}}
对象结构示例:
[object SequelizeInstance:blog_comment],[object SequelizeInstance:blog_comment],[object SequelizeInstance:blog_comment]
blog_comments: [
{
commentId: 1,
comment: 'Test',
userId: 2},
{
commentId:2,
comment: '2nd Test',
userId: 1
}]
hbs.registerHelper('commentLimit', function(comment, limitAmount, options){
if(comment.length > limitAmount){
return comment.slice(0,limitAmount);
} else {
return comment;
}
})
{{#commentLimit blog_comments 2}}
{{#ifeq userId @root.user.userId}}
<a href="#" class="comment-delete" data-comment-id="{{commentId}}">Delete</a></p>
{{/ifeq}}
<p class="blog-comment">{{comment}}</p>
{{/commentLimit}}
注册车把:
[object SequelizeInstance:blog_comment],[object SequelizeInstance:blog_comment],[object SequelizeInstance:blog_comment]
blog_comments: [
{
commentId: 1,
comment: 'Test',
userId: 2},
{
commentId:2,
comment: '2nd Test',
userId: 1
}]
hbs.registerHelper('commentLimit', function(comment, limitAmount, options){
if(comment.length > limitAmount){
return comment.slice(0,limitAmount);
} else {
return comment;
}
})
{{#commentLimit blog_comments 2}}
{{#ifeq userId @root.user.userId}}
<a href="#" class="comment-delete" data-comment-id="{{commentId}}">Delete</a></p>
{{/ifeq}}
<p class="blog-comment">{{comment}}</p>
{{/commentLimit}}
在模板中使用:
[object SequelizeInstance:blog_comment],[object SequelizeInstance:blog_comment],[object SequelizeInstance:blog_comment]
blog_comments: [
{
commentId: 1,
comment: 'Test',
userId: 2},
{
commentId:2,
comment: '2nd Test',
userId: 1
}]
hbs.registerHelper('commentLimit', function(comment, limitAmount, options){
if(comment.length > limitAmount){
return comment.slice(0,limitAmount);
} else {
return comment;
}
})
{{#commentLimit blog_comments 2}}
{{#ifeq userId @root.user.userId}}
<a href="#" class="comment-delete" data-comment-id="{{commentId}}">Delete</a></p>
{{/ifeq}}
<p class="blog-comment">{{comment}}</p>
{{/commentLimit}}
{{{#commentLimit blog_comments 2}
{{{#ifeq userId@root.user.userId}
{{/ifeq}
{{comment}
{{/commentLimit}}
解决方案1。是。您需要使用for循环内部辅助对象
hbs.registerHelper('commentLimit', function(comment, limitAmount, options) {
let res = comment;
if (comment.length > limitAmount) {
res = comment.slice(0, limitAmount);
}
let out ='';
for (var i = 0; i < res.length; i++) {
out = out + options.fn(res[i]);
}
return out;
})
commentLimit
helper与您得到的相同
hbs.registerHelper('commentLimit', function(comment, limitAmount, options){
if(comment.length > limitAmount){
return comment.slice(0,limitAmount);
} else {
return comment;
}
})
@kumkanillam提供的精炼答案:
Handlebars.registerHelper('commentLimit', function (comment, limitAmount, options){
var commentList = comment.slice(0, limitAmount + 1);
return commentList.reduce(function(results, comment) {
return results + options.fn(comment);
}, '');
});
其思想是返回每个迭代结果的串联。“reduce”函数可以很好地处理此任务
您可以考虑期权调用:
options.fn(comment)
在{{commentLimit…}}和{/commentLimit}之间运行代码块,上下文是参数提供的值(在本例中,是blog#u comments')。感谢您的回答。非常有用,但是我发现使用上面的循环有问题。当我跟随你的助手修改并只使用
{{{commentLimit blog{u comments 2}}{{/commentLimit}}
时,我得到了正确的2条记录限制,但它会在同一条记录上迭代两次,而不是前两条记录。当我使用{{{{{{{}each(commentLimit blog_comments 2)}{{{/each}}
时,我得到选项。fn不是一个函数
。当我将if语句与{{{#each(commentLimit blog_comments 2)}}
一起使用时,我得到了正确的输出。前两次尝试出现问题的原因是什么?哦,对不起。对于第一个选项,只需在helper中将res[0]
替换为res[i]
。对于第二个解决方案,您的原始助手就足够了