使用每个和车把帮手对对象键进行排序

时间:2019-05-29 14:40:45

标签: javascript json handlebars.js

我想对每个对象的键进行排序: 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
})

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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)。 希望对您有所帮助。