如何合并两个大小相同的不同对象数组?

How do you merge two different arrays of objects of the same size?

我正在尝试将以下两个对象合并为一个。我希望它是一组具有值 {companyType, companyName, companyLocation, companyPhone, score} 的对象,但我尝试过的所有方法都没有正确合并对象。实际物体要大得多,但它们的尺寸完全相同。所以我需要一些东西来处理数组中的许多对象,而不仅仅是每个数组中的两个项目。

let company_details = [{companyType: 'Carrier',
                        companyName: 'Auto',
                        companyLocation: 'San Diego, CA',
                        companyPhone: '(123) 456-7890' },
                       {companyType: 'Dealer',
                        companyName: 'Car',
                        companyLocation: 'Indianapolis, IN',
                        companyPhone: '(234) 567-8901' }]

let scoreArr= [{score: 'Your Rating: None'},
               {score: 'Your Rating: Positive'}]

此方法采用相同长度数组的数组,并在每个索引处合并对象。

使用的方法:

  • Array#reduce 用于减少一组数组并得到单个数组。

  • Array#map 用于将对象与 reduce a 左侧的对象和 reduce b 右侧的对象映射到同一索引处.

  • spread syntax ... 用于将对象克隆为对象字面量。该顺序定义了相同命名属性的值,最后获胜。

结果是一个对象数组。

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

一些函数式语言有很好的列表理解工具,例如Haskell的zipWith。它采用两个列表并对每组元素应用双变量函数。

然而,我们可以很容易地用现在的JS(ES6)中的箭头函数来实现它:

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

以防你不习惯箭头函数的语法:zipWith是一个三参数函数,一个函数f,还有数组xsys.

然后我们使用map,数组的内置方法。它以一个函数作为参数并将 xs 的每个元素应用于它。因此 map 参数中的第二个箭头函数。当map接收一个双变量函数时,它提供每个元素对应的数组索引作为第二个参数,这里i.

我们现在提供 x xs 的一个元素作为我们提供的函数 f[=50= 的第一个参数].第二个参数是另一个数组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);