【问题标题】:How do you merge two different arrays of objects of the same size?如何合并两个大小相同的不同对象数组?
【发布时间】:2020-02-03 21:45:47
【问题描述】:

我正在尝试将以下两个对象合并为一个。我希望它是一个具有值 {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'}]

【问题讨论】:

  • 数组之间是否存在正式关系?
  • Python 有一个内置函数,称为 zip。 docs.python.org/3.3/library/functions.html#zip
  • 您提出的问题太含糊,我无法理解,无法回答。请重新措辞以包含预期结果。

标签: javascript arrays javascript-objects array-merge


【解决方案1】:

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

使用的方法:

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

【讨论】:

  • 虽然“我认为您肯定走在正确的道路上,”尼娜,我可以建议您重新编写答案以更清楚吗?例如,告诉可怜的灵魂reduce 做了什么。而且,使用简单的for-loop 的替代解释怎么样?只是一个想法......
【解决方案2】:

一些函数式语言有非常好的列表理解工具,例如 Haskell 的 zipWith。它需要两个列表并对每组元素应用一个二元函数。

但是,我们可以很容易地在当前的 JS (ES6) 中使用箭头函数来实现它:

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

如果你不习惯箭头函数语法:zipWith是一个函数,有三个参数,一个函数f,和数组xs

然后我们使用 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);

这一切都在你可以运行的 sn-p 中。我已经修剪了你的对象以使 sn-p 更清晰。

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

【讨论】:

    猜你喜欢
    • 2019-07-19
    • 2017-09-20
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2016-03-08
    • 2020-10-03
    • 1970-01-01
    • 2020-08-24
    相关资源
    最近更新 更多