如何合并两个大小相同的不同对象数组?
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,还有数组xs 和 ys.
然后我们使用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);
我正在尝试将以下两个对象合并为一个。我希望它是一组具有值 {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
用于将对象与 reducea
左侧的对象和 reduceb
右侧的对象映射到同一索引处.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,还有数组xs 和 ys.
然后我们使用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);