Сортировка ключей объектов с помощью каждого и помощника по рулю

Я хотел бы отсортировать ключи объектов с каждым: тест1, тест4, тест3 => тест1, тест3, тест4 ...

Мой 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
})

Каков ожидаемый результат?

Naga Sai A 29.05.2019 16:44

Это 5,3,8 и 1,12,14 с моим кодом руля в списке html.

Sebastian 29.05.2019 16:47

Обратите внимание, что в заголовке указано «Сортировка массива...», но вместо этого вы хотите отсортировать ключи объекта по их значениям.

Nico Diz 29.05.2019 17:21

@NicoDiz Ты прав. Я отредактировал свой пост.

Sebastian 29.05.2019 17:25

Здорово! Мой ответ сработал?

Nico Diz 29.05.2019 17:27

Я отметил первый ответ, потому что это было именно то, что я искал. Но спасибо за вашу помощь.

Sebastian 03.06.2019 00:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
271
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

вы визуализируете весь объект вместо значения. Попробуй это:

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

Спасибо за вашу помощь, но это не сортирует мои объекты по значению ключа.

Sebastian 29.05.2019 16:59

Так и будет. вспомогательный метод, который вы написали, будет работать. вам просто нужно изменить способ доступа к отсортированным значениям.

jensteichert 29.05.2019 17:02

Омг, ты прав. извините! Когда я хочу создать вторую таблицу с такой же сортировкой, но с ключом, я не получаю вывод с ключом.значение

Sebastian 29.05.2019 17:22

если вы хотите отобразить ключ, используйте `{{this.key}}'

jensteichert 29.05.2019 17:28

Замените функцию 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.info(eachSorted(tests.chapter1));

Кроме того, в вашем JSON tests есть объект. Вы уверены, что можете применить each к объекту? Возможно, вам следует использовать массив. Вы можете изменить JSON или создать registerHelper, который создает массив из значений. Использование: Object.values(tests). Надеюсь, поможет.

Другие вопросы по теме