Javascript - Сортировать массив с помощью lodash - Получить ключ от исходной переменной - PullRequest
0 голосов
/ 25 октября 2018

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

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

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 и т. Д. Теперь я хочусортировать массив.Это я делаю с помощью функции lodash sortBy.

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.
})

См. Рисунок отладки:

enter image description here

ОБНОВЛЕНИЕ

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

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> 
        );
    }
})

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

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

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

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

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');
} 
0 голосов
/ 25 октября 2018

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

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];
});

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

...