Как объединить два разных массива объектов одинакового размера? - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь объединить следующие два объекта в один. Я хочу, чтобы это был массив объектов со значениями {companyType, companyName, companyLocation, companyPhone, score}, но все, что я пробовал, не объединяет объекты должным образом. Реальные объекты намного больше, но имеют одинаковый точный размер. Поэтому мне нужно что-то, что имеет дело со многими объектами в массиве, а не только с двумя элементами в массиве.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Этот подход использует массив массивов одинаковой длины и объединяет объекты в каждом индексе.

Используемые методы:

  • Array#reduce для сокращения набора массивов и получения одного массива.

  • Array#map для сопоставления объектов с объектом с левой стороны Reduce a и объект с правой стороны приставки b с тем же индексом.

  • расширенный синтаксис ... для клонирования объекта как литерала объекта. Порядок определяет значение одноименных свойств, последние выигрыши.

В результате получается массив объектов.

let companies = [{ companyType: 'Carrier', companyName: 'Auto', companyLocation: 'San Diego, CA', companyPhone: '(123) 456-7890' }, { companyType: 'Dealer', companyName: 'Car', companyLocation: 'Indianapolis, IN', companyPhone: '(234) 567-8901' }],
    scores = [{ score: 'Your Rating: None' }, { score: 'Your Rating: Positive' }],
    merged = [companies, scores].reduce((a, b) => a.map((o, i) => ({ ...o, ...b[i] })));

console.log(merged);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 04 февраля 2020

Некоторые функциональные языки имеют очень хорошие инструменты для работы со списками, например, Haskell zipWith. Он принимает два списка и применяет двумерную функцию к каждому набору элементов.

Однако в настоящее время мы можем легко реализовать ее с помощью функций стрелок JS (ES6):

const zipWith = f => xs => ys => xs.map((x, i) => f(x, ys[i]));

In Если вы не используете стрелки для синтаксиса функции: zipWith - это функция с тремя параметрами, функцией f и массивами xs и ys .

Затем используем map , встроенный метод Array. Он принимает функцию в качестве аргумента и применяет к ней каждый элемент xs . Отсюда вторая функция стрелки в аргументе map. Когда map получает двумерную функцию, она предоставляет индекс массива, соответствующий каждому элементу, в качестве второго аргумента, здесь i .

Мы предоставляем x элемент xs в качестве первого аргумента нашей предоставленной функции f . Второй аргумент - это соответствующий элемент другого массива ys[i].

. С помощью функции zipWith нам нужна другая функция для объединения этих объектов в вашем массиве. Здесь помогает метод Object.assign :

const mergerFun = (a, b) => Object.assign({}, a, b)

Теперь примените его к своим массивам:

const result = zipWith(mergerFun)(company_details)(scoreArr);

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

const companyDetails = [
  {
    type: 'Carrier',
    name: 'Auto',
  },
  {
    type: 'Dealer',
    name: 'Car',
  },
];

const scoreArr = [
  {
    score: 'None'
  },
  {
    score: 'Positive'
  },
];

// zipWith :: ( a -> b -> c ) -> [a] -> [b] -> [c]
const zipWith = f => xs => ys => xs.map((x, i) => f(x, ys[i]));

// mergerFun :: a -> b -> c
const mergerFun = (a, b) => Object.assign({}, a, b);

// put it all together
const result = zipWith(mergerFun)(companyDetails)(scoreArr);

console.log(result);
...