Переместить ключ / значение из массива объектов в другой массив по совпадающему элементу

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

У меня есть два массива с объектами, содержащими страны и их код страны. В одном из массивов указаны страны на английском языке, а также есть ключ с изокодом страны. Это выглядит так:

 [{
 "name": "Denmark",
 "dialCode": " 45",
 "isoCode": "DK",
},
{
 "name": "Germany",
 "dialCode": " 49",
 "isoCode": "DE",
}]
 

Другой массив содержит названия стран на датском языке и код набора номера, но без изокода.

 [{
 "name": "Danmark",
 "dialCode": " 45",
},
{
 "name": "Tyskland",
 "dialCode": " 49",
}]
 

Теперь я хочу переместить / скопировать изокод из английского массива в датский, соответствующий наборному коду.
Но я немного не понимаю, как это сделать.

У меня есть соответствие с этим

 let result = this.dkList.filter(country1 => this.countryList.some(country2 => country2.dialCode === country1.dialCode.replace('00 ', ' ').trim()))
 

Мой ожидаемый результат должен быть

 [{
    "name": "Danmark",
    "dialCode": " 45",
    "isoCode": "DK"
  },
  {
    "name": "Tyskland",
    "dialCode": " 49",
    "isoCode": "DE"
  }
]
 

Комментарии:

1. Ваши данные не являются массивом. Это объект

2. @Nitheesh «два массива с объектами»…

3. @Nitheesh — Отредактировал мой вопрос

4. Можете ли вы также привести пример ожидаемого результата с приведенными выше данными?

5. @NickParsons — Я отредактировал свой вопрос

Ответ №1:

Этот .filter() метод используется для удаления элементов из массива, что здесь не то, что вы хотите сделать, вместо этого Вы хотите отобразить (т. Е. Преобразовать) Ваши данные.

Сначала вы можете создать карту, вызываемую isoLookup из вашего первого массива, которая создает ключи на основе. на dialCode основе значений и на основе isoCode в вашем массиве. Затем вы можете использовать эту карту, чтобы получить код ISO с помощью dialCode . После того, как вы создали поиск по карте, вы можете использовать .map() на своем втором arr2 для сопоставления ваших объектов с новыми объектами со isoCode свойством, которое содержит значение, полученное из поиска по карте:

 const arr1 = [{ "name": "Denmark", "dialCode": " 45", "isoCode": "DK", }, { "name": "Germany", "dialCode": " 49", "isoCode": "DE", }];
const arr2 = [{ "name": "Danmark", "dialCode": " 45", }, { "name": "Tyskland", "dialCode": " 49", }];

const isoLookup = new Map(arr1.map(obj => [obj.dialCode, obj.isoCode]));
const res = arr2.map(obj => ({...obj, isoCode: isoLookup.get(obj.dialCode)}));
console.log(res); 

Создание карты для использования в качестве поиска позволяет вашему коду хорошо масштабироваться, в соответствии с выполнением поиска arr1 для каждой итерации вашего .map() метода.

Комментарии:

1. Спасибо! Будем разбираться в этом! Я использую фильтр для удаления стран из английского массива, которые не могут быть найдены в датском массиве, например, «Антарктида».

2. @MortenHagh а, понял тебя, я принял это за код, который не работал. Тогда все хорошо, .map() для этого должно быть то, что нужно

3. Ваш код отлично работает с моим! Спасибо!

Ответ №2:

Просто просмотрите все элементы массива, сравните их цифровые коды и скопируйте изокоды в датскую версию.

 const en = [...]; // array with english data
const den = [...]; // array with danish data

// it will work if en.length = den.length
for (let i = 0; i < en.length; i  ) {
  if (den[i].dialCode === en[i].dialCode) { // compare en amp; den dial codes
    den[i].isoCode = en[i].isoCode;
  }
}
 

Ответ №3:

 var en = []
var den = []
den.forEach(eni => {
    en.forEach(deni => {
        if (eni.dialcode == deni.dialcode) {
            den.dialcode = en.dialcode
        }
    })
})
 

теперь у вас должен быть массив в var den

Ответ №4:

Однострочное решение, если не возражаете

 const arr1 = [{ "name": "Denmark", "dialCode": " 45", "isoCode": "DK", }, { "name": "Germany", "dialCode": " 49", "isoCode": "DE", }];
const arr2 = [{ "name": "Danmark", "dialCode": " 45", }, { "name": "Tyskland", "dialCode": " 49", }];

result = arr1.map(({ dialCode, isoCode }) => ({ name: arr2.find((o) => dialCode === o.dialCode).name, dialCode, isoCode }));

console.log(result); 

Ответ №5:

Поскольку оба списка содержат dialCode : с помощью Array.prototype.reduce() вы можете создать хэш на arr1 основе dialCode свойства и, наконец, получить результат из списка Array.prototype.map() arr2

Код:

 const arr1 = [{name: 'Denmark',dialCode: ' 45',isoCode: 'DK',},{name: 'Germany',dialCode: ' 49',isoCode: 'DE'}]
const arr2 = [{name: ' Danmark',dialCode: ' 45',},{name: 'Tyskland',dialCode: ' 49'}]

const hash = arr1.reduce((a, c) => ((a[c.dialCode] = c.isoCode), a), {});
const restult = arr2.map(c => ({ ...c, isoCode: hash[c.dialCode] }));

console.log(restult);