在Javascript中合并两个对象数组

4

我有两个对象数组:

let genericObj = [{"name": "success", }, {"name": "failure"}, {"name":"timeout"}, {"name": "max"}, {"name": "min"}, {"name": "avg"}]
let x = [
    { y: 14037 },
    { y: 0 },
    { y: 0 },
    { y: 1.1960000000000002 },
    { y: 0.089 },
    { y: 0.18 }
  ];

我希望将它们合并,以便我有一个对象数组。

let finalObj= [{"name": "success", y: 23432}, {"name": "fail", y: 23423}] etc

我试过一些方法,但对我都不起作用。


3
问题不清楚--我没看到有简单的方法可以从你的输入示例得出你的输出示例。你能再看一下吗? - David P. Caldwell
1
你的例子没有意义,其中一个y值具有23432的值。另外,请详细说明您尝试过什么。 - sinanspd
8个回答

5

您可以将数组中的数组合并为一个对象,并根据索引进行合并。

这种方法适用于任何数量的数组。

let genericObj = [{"name": "success", }, {"name": "failure"}, {"name":"timeout"}, {"name": "max"}, {"name": "min"}, {"name": "avg"}],
    x = [{ y: 14037 }, { y: 0 }, { y: 0 }, { y: 1.1960000000000002 }, { y: 0.089 }, { y: 0.18 }],
    result = [genericObj, x].reduce((a, b) => a.map((o, i) => ({ ...o, ...b[i] })));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


使用涉及reduce的方法是否更加优化CPU? - Rkv88 - Kanyan

4

我假设您只想要将两个对象“压缩”在一起。 如果是这样,您可以使用 Array.map 以及 Object.assign

let genericObj = [{"name": "success", }, {"name": "failure"}, {"name":"timeout"}, {"name": "max"}, {"name": "min"}, {"name": "avg"}]
let x = [
    { y: 14037 },
    { y: 0 },
    { y: 0 },
    { y: 1.1960000000000002 },
    { y: 0.089 },
    { y: 0.18 }
  ];
  
let result = genericObj.map((obj, i) => Object.assign(obj, x[i]));
console.log(result);


3

这是你需要的吗?

let genericObj = [{"name": "success", }, {"name": "failure"}, {"name":"timeout"}, {"name": "max"}, {"name": "min"}, {"name": "avg"}]
let x = [
    { y: 14037 },
    { y: 0 },
    { y: 0 },
    { y: 1.1960000000000002 },
    { y: 0.089 },
    { y: 0.18 }
  ];
  
  
  finalObj=genericObj.map((z,i)=>{return({...z,y:x[i].y})});



document.write(JSON.stringify(finalObj));


3

使用map是实现这一功能的好方法。

genericObj.map((item, i) => ({...item, ...x[i]}));

let genericObj = [{"name": "success", }, {"name": "failure"}, {"name":"timeout"}, {"name": "max"}, {"name": "min"}, {"name": "avg"}]
let x = [
    { y: 14037 },
    { y: 0 },
    { y: 0 },
    { y: 1.1960000000000002 },
    { y: 0.089 },
    { y: 0.18 }
  ];
let newObj = genericObj.map((item, i) => ({...item, ...x[i]}));

console.log(newObj)


2
const genericObj = [
    {"name": "success"},
    {"name": "failure"},
    {"name":"timeout"},
    {"name": "max"},
    {"name": "min"},
    {"name": "avg"}
];
const x = [
    { y: 14037 },
    { y: 0 },
    { y: 0 },
    { y: 1.1960000000000002 },
    { y: 0.089 },
    { y: 0.18 }
  ];

function getData1(genericObj, x) {
    let result = genericObj.map((obj, i) => Object.assign(obj, x[i]));
    return result;
}

function getData2(genericObj, x) {
    let result = [genericObj, x].reduce((a, b) => a.map((o, i) => ({ ...o, ...b[i] })));
    return result;
}

function time(fn) {
    const start = performance.now();
    let result = fn();
    const end = performance.now();
    console.log(result);
    console.log(`Benchmark took ${end - start} milliseconds`);
}

time(() => getData1(genericObj, x)); //too fast

time(() => getData2(genericObj, x)); //slow

输出快照: 在此输入图片描述


1
只需循环遍历并将一个数组中的每个对象推入另一个数组即可。
array2.forEach(item => {
    array1.push(item);
});

这只会将一个数组添加到另一个数组之后。我相信 OP 希望将第二个数组对象的部分合并到第一个数组对象中。 - Davidicus

0
使用 Object.assign()
var finalObj = Object.assign({}, genericObj, x);

console.log(finalObj);


这只会创建一个新对象。我认为 OP 正在寻找一个对象数组,其中包含一个数组的对象与另一个数组的对象合并。 [{"name": "成功", y: 23432}, {"name": "失败", y: 23423}] - Davidicus

0

这是您可以解决问题的方法,只需使用es6/spred:

let merge = [...genericObj,...x]

1
这将仅合并两个数组。我相信OP想要将第二个数组对象的部分与第一个数组对象结合起来。 - Davidicus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接