Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 把手数组长度条件辅助对象_Javascript_Arrays_Handlebars.js - Fatal编程技术网

Javascript 把手数组长度条件辅助对象

Javascript 把手数组长度条件辅助对象,javascript,arrays,handlebars.js,Javascript,Arrays,Handlebars.js,我有一个场景,在这个场景中,我试图创建一个自定义的Handlebar辅助对象,它查看数组的长度,如果该数组中存在三个以上的对象,则只返回前三个元素,如果不存在,则返回全部元素。下面是我的尝试,当我为limitAmount传入一个值时,我得到了正确数量的对象,但是返回的值是[object SequelizeInstance:blog_comment],表示存在的对象数量。这不是我想要的,我现在想知道是否应该使用for循环来传回对象的值。这是简单地用for循环解决的吗 显示内容的详细示例: [obj

我有一个场景,在这个场景中,我试图创建一个自定义的Handlebar辅助对象,它查看数组的长度,如果该数组中存在三个以上的对象,则只返回前三个元素,如果不存在,则返回全部元素。下面是我的尝试,当我为
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]
。对于第二个解决方案,您的原始助手就足够了