Я уверен, что это простой вопрос, но на самом деле я не могу найти решения. Может кто мне подскажет.
У меня есть такой тип массива объектов:
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.
})
См. Изображение отладки:
ОБНОВИТЬ
Есть ли лучшее решение, чем это:
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>
);
}
})
Хорошо, спасибо за подсказку, но вопрос все тот же.
Решение, которое я предлагаю, - вместо использования 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');
}
Обратите внимание, что у вас нет массивов во входных данных, только объекты.