Javascript: как объединить два массива с повторяющимися ключами в объект

У меня есть два массива

array1 = [Alabama, Alabama, Georgia, Georgia, Georgia, California ]
array2 = [Mobile, Montgomery, Atlanta, Savannah, Montgomery, San Francisco ]

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

Мне нужно преобразовать его в такой объект в Javascript. Таким образом, я могу легко заполнить условное раскрывающееся меню, когда выбрано состояние, если только у кого-то нет идеи сделать то же самое с двумя разными массивами.

var citiesByState = {
   Alabama: ["Mobile","Montgomery"],
   Georgia: ["Savannah","Montgomery"],
   California: ["San Francisco"]
}

Любая помощь будет принята с благодарностью

Я пробовал несколько разных способов, но они создают объекты объектов, а не то, что я хочу выше.

Я думаю, что это немного сложно, потому что как отличить штат от города? Вы сравниваете состояние с другими данными?

Fowotade Babajide 10.01.2023 14:33

Каков ваш подход до сих пор?

kevinSpaceyIsKeyserSöze 10.01.2023 14:34
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
0
2
72
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Решение :

Не забудьте оставить отзыв.

const array1 = ['Alabama', 'Alabama', 'Georgia', 'Georgia', 'Georgia', 'California' ];

const array2 = ['Mobile', 'Montgomery', 'Atlanta', 'Savannah', 'Montgomery', 'San Francisco'];

const objProps = Array.from(new Set(array1));
const citiesByState = {};

objProps.forEach(state => {
  citiesByState[state] = [];
})

array1.forEach((state, idx) => {
  citiesByState[state].push(array2[idx]);
})

console.info(citiesByState);

Я считаю, что следующий код решает ваш вопрос.

let array1 = ["Alabama", "Alabama", "Georgia", "Georgia", "Georgia", "California"];
let array2 = ["Mobile", "Montgomery", "Atlanta", "Savannah", "Montgomery", "San Francisco"];

let citiesByState = {};
for (let [index, state] of array1.entries()) {
  if (!citiesByState[state]) {
    // if the state has not been added yet, add it
    citiesByState[state] = [];
  }
  // push the corresponding city index onto the state array
  citiesByState[state].push(array2[index]);
}

console.info(citiesByState);

Вот пример с уменьшением:

let array1 = ['Alabama', 'Alabama', 'Georgia', 'Georgia', 'Georgia', 'California' ]
let array2 = ['Mobile', 'Montgomery', 'Atlanta', 'Savannah', 'Montgomery', 'San Francisco' ]
let result = array1.reduce((memo, state, idx) => {
  if (!memo[state]){
     memo[state] = array2[idx];
  } else {
    const rest =  Array.isArray(memo[state]) ? memo[state].flat() : [memo[state]]
    memo[state] = [array2[idx], ...rest];
  }
  return memo;  
}, {});

console.info(result)

Чистота и меньше линий

var array1 = ["Alabama", "Alabama", "Georgia", "Georgia", "Georgia", "California", "Alabama"];

var array2 = ["Mobile", "Montgomery", "Atlanta", "Savannah", "Montgomery", "San Francisco", "test"];

const res = array1.reduce((ac,a, index) => {
  let key = a;
  ac[key] = ac[key] || [];
  ac[key].push(array2[index])
  return ac;
}, {});

console.info(res)

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