我正在尝试编写一个函数,它接受一个对象数组和无限数量的数组,并将它们组合成一个对象。输入将遵循以下模式:
let x = [{ name: 'Tom' }, { name: 'John' }, { name: 'Harry' }];
let y = [[1, 2, 3], 'id'];
let z = [['a', 'b', 'c'], 'value'];
combine(x, y, z);
使用y
和z
的第二个元素作为对象键。使用这些参数,该函数应返回以下数组:
[
{
name: 'Tom',
id: 1,
value: 'a'
},
{
name: 'John',
id: 2,
value: 'b'
},
{
name: 'Harry',
id: 3,
value: 'c'
},
]
应使用当前对象的索引来获取数组中的正确元素。我试图解决这个问题:
function combine(object, ...arrays) {
return object.map((obj, index) => {
let items = arrays.map(arr => ({
[arr[1]]: arr[0][index]
}));
return Object.assign({}, obj, { items });
});
}
这几乎完成了这项工作,但导致数组项隐藏在嵌套的items
数组中,我该如何解决?
答案 0 :(得分:3)
您一直在分配一个对象对象,结果是一个内部有元素项的新对象(对象文字的另一个特征)。
此方法使用reduce而不是map和direct assign而不是object literal。
function combine(object, ...arrays) {
return object.map((obj, index) => {
const items = arrays.reduce((acc, arr) => {
acc[arr[1]] = arr[0][index] ;
return acc;
}, {});
return Object.assign({}, obj, items);
});
}
const x = [{ name: 'Tom' }, { name: 'John' }, { name: 'Harry' }];
const y = [[1, 2, 3], 'id'];
const z = [['a', 'b', 'c'], 'value'];
combine(x, y, z);
您也可以在Object.assign中使用spread运算符,如下所示:
function combine(object, ...arrays) {
return object.map((obj, index) => {
let items = arrays.map(arr => ({
[arr[1]]: arr[0][index]
}));
return Object.assign({}, obj, ...items);
});
}
答案 1 :(得分:1)
这几乎可以完成工作,但会导致数组项隐藏在嵌套项数组
中
问题是items
是一个数组,而您只需要该特定map
回调中的当前项。这里不需要嵌套循环。
另外,我建议每combine
次调用避免多个属性。生成的代码如下所示:
function combine(objects, [values, key]) {
return objects.map((o, i) =>
Object.assign({[key]: values[i]}, o)
);
}
combine(combine(x, y), z);
如果您有多个扩展程序要做,您也可以使用
[y, z].reduce(combine, x)
答案 2 :(得分:0)
使用地图和计算键,您可以实现此目的。 这是一个有效的例子:
let x = [{
name: 'Tom'
}, {
name: 'John'
}, {
name: 'Harry'
}];
let y = [[1, 2, 3], 'id'];
let z = [['a', 'b', 'c'], 'value'];
let result = [];
x.map(function (el, index) {
result.push(el);
let index = result.length -1;
result[index][y[1]] = y[0][index];
result[index][z[1]] = z[0][index];
});
console.log(result);