Javascript - Сортировка массива с lodash - Получение ключа из исходной переменной

Я уверен, что это простой вопрос, но на самом деле я не могу найти решения. Может кто мне подскажет.

У меня есть такой тип массива объектов:

const Country = {
    albania:
    {
        'iso':'al',
        'countryNo': 70,
        'name': 
        {
            de: 'Albanien',
            en: 'Albania',
            pl: 'Albania',
        },
        'flag':'flag-icon-al',
        'showCountry':true,
    },
    austria:
    {
        'iso':'at',
        'countryNo': 38,
        'name': 
        {
            de: 'Österreich',
            en: 'Austria',
            pl: 'Austria',
        },
        'flag':'flag-icon-at',
        'showCountry':true,
    },
    belgium:
    {
        'iso':'be',
        'countryNo': 2,
        'name': 
        {
            de: 'Belgien',
            en: 'Belgium',
            pl: 'Belgia',
        },
        'flag':'flag-icon-be',
        'showCountry':true,
    },
...

Ключи этого объекта - albania, austria и т. д. Теперь я хочу отсортировать массив. Это я делаю с функцией lodashsortBy.

let countryList = _.sortBy(Country,'name[' + this.props.currentLanguage + ']');

Когда я перебираю массив countryList, как я могу получить исходные ключи из массива объектов Country, то есть albania?

Я пробовал работать с функцией map, но получаю только ключи с именами 0, 1 и т. д.

countryList.map((country,key) => {
    // country -> has all object information
    // key -> 0, 1, 2 etc.
})

См. Изображение отладки:

Javascript - Сортировка массива с lodash - Получение ключа из исходной переменной

ОБНОВИТЬ

Есть ли лучшее решение, чем это:

countryList.map((country,key) => {
    var key = Object.keys(Country).find(function(element) {
        const countryInner = Country[element];
        if (countryInner.countryNo === country.countryNo) {
            return element;
        }
    });
    if (country.showCountry === true) {
        return (
            <HashLink to = "/#locations" className = {"dropdown-item imageLink animated"} onClick = {(e) => this.handleClickCountry(e, key)} key = {"nav" + key}>{country.name[this.props.currentLanguage].toUpperCase()}</HashLink> 
        );
    }
})

Обратите внимание, что у вас нет массивов во входных данных, только объекты.

CertainPerformance 25.10.2018 11:04

Хорошо, спасибо за подсказку, но вопрос все тот же.

dns_nx 25.10.2018 11:16
Поведение ключевого слова "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
2
151
2

Ответы 2

Решение, которое я предлагаю, - вместо использования lodash создать двумерный массив из вашего объекта. В основном переместите их в массив, отсортируйте этот массив и затем перестройте

var countryList = [];
for (var con in Country) {
    countryList.push([con, Country[con]]);
}
//Sort based on key value
sortable.sort(function(a, b) {
  return a[0] > b[0];
});

Получив массив, вы можете перестроить объект из массива в нужном вам порядке. Благодаря этому ваш ключ не будет потерян, и вам не придется повторять дважды, чтобы его найти. Надеюсь, это поможет

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

let countries = _.map(Country, (country, key) => {
    country.key = key;
    return country;
});

Теперь мы можем снова отсортировать массив с помощью метода lodash sortBy.

let orderedCountries = _.sortBy(countries, function (country) {
    return country.name[lang]
});

где lang - один из ваших языков ('de'm' en ',' pl ') ...

Я считаю, что вы также хотите отфильтровать свой список в зависимости от их свойства showCountry, поэтому давайте объединим их все ...

function sortAndFilterCountries(countries, lang) {
    countries = _.map(countries, (country, key) => {
        country.key = key;
        return country;
    });
    let orderedCountries = _.sortBy(countries, function (country) {
        return country.name[lang]
    });
    return _.filter(orderedCountries, 'showCountry');
} 

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