使用 each 和 handlebars 助手对对象键进行排序

Posted

技术标签:

【中文标题】使用 each 和 handlebars 助手对对象键进行排序【英文标题】:Sort object keys with each and handlebars helper 【发布时间】:2019-05-29 14:40:45 【问题描述】:

我想对每个对象的键进行排序: test1, test4, test3 => test1, test3, test4 ...

我的 json:

"tests": 
    "chapter1": 
        "test1": 5,
        "test4": 8,
        "test3": 3
    ,
    "chapter2": 
        "test1": 1,
        "test5": 14,
        "test3": 12
     

我的车把代码:

#each tests
    <h1>@key</h1>
    <ul>#eachSorted this<li>this</li>/eachSorted</ul>
/each

我试过了,还是不行:

Handlebars.registerHelper('eachSorted', function(context, options) 
    var ret = ""
    Object.keys(context).sort().forEach(function(key) 
        ret = ret + options.fn(key: key, value: context[key])
    )
    return ret
)

【问题讨论】:

预期输出是什么? 它是 5,3,8 和 1,12,14,我的车把代码在一个 html 列表中。 请注意,标题是“排序数组...”,但您想使用它们的值对对象键进行排序。 @NicoDiz 你是对的。我编辑了我的帖子。 太棒了!我的回答有用吗? 【参考方案1】:

您正在渲染整个对象而不是值。试试这个:

#each tests
    <h1>@key</h1>
    <ul>#eachSorted this<li>this.value</li>/eachSorted</ul>
/each

【讨论】:

感谢您的帮助,但这不会按键值对我的对象进行排序。 会的。您编写的辅助方法将起作用。您只需要更改访问排序值的方式。 天哪,你是对的。对不起!当我想创建第二个具有相同排序但带有键的表时,我没有得到带有 key.value 的输出 如果你想渲染键使用`this.key'【参考方案2】:

eachSorted 函数替换为:

var tests = 
    "chapter1": 
        "test1": 5,
        "test4": 8,
        "test3": 3
    ,
    "chapter2": 
        "test1": 1,
        "test5": 14,
        "test3": 12
     
;

function eachSorted(context) 
    var ret = ;
	Object.keys(context)
		.sort()
		.forEach(function(key) 
			ret[key] = context[key];
    );
    return ret;



console.log(eachSorted(tests.chapter1));

另外,在您的 JSON 中,tests 是一个对象。您确定可以将each 应用于对象吗?也许你应该使用一个数组。您可以更改 JSON,也可以创建一个 registerHelper,从值创建一个数组。使用:Object.values(tests)。 希望对您有所帮助。

【讨论】:

以上是关于使用 each 和 handlebars 助手对对象键进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在 Meteor 中的字符串数组上使用 Handlebars #each 进行迭代

在 Handlebars 中使用带有多个变量的“#each”

Ember.js - 使用 Handlebars 助手检测子视图是不是已呈现

?? Handlebars 'each' ?????????

handlebars,each循环里面套each循环

Handlebars的奇数和偶数比较助手[关闭]