Javascript将两个对象数组组合在一起



我想根据名称组合2个数组的元素。例如:

Array1 = [
{name: "name1", language: "lang1"}, 
{name: "name2", language: "lang2"}, 
{name: "name3", language: "lang3"}]
Array2 = [
{name: "name1", subject: "sub1"}, 
{name: "name2", subject: "sub2"}, 
{name: "name3", subject: "sub3"}]

我需要生成以下数组:

Array3 = [
{language: "lang1", subject: "sub1"}, 
{language: "lang2", subject: "sub2"}, 
{language: "lang3", subject: "sub3"}]

我能想到的逻辑是写一个显式的for循环,将第一个数组的每个元素与第二个数组的每一个元素进行比较,并检查名称是否匹配,如下所示。

let Array3 = []
for(let i=0;i<Array1.length;i++)
{
let elem = Array1[i];
for(let j=0;j<Array2.length;j++)
{
if(Array2[j].name===elem.name)
{
Array3.append({language: elem.language, subject: Array2[j].subject})
break;
}
}
}

然而,我的实际数据集相当大,这似乎效率低下。如何以更有效的方式实现这一点(比如使用高阶函数或其他什么(?

使用Map for O(1(查找其中一个使用name作为键的数组,可以使每个数组只迭代一次。

const Array1=[{name:"name1",language:"lang1"},{name:"name2",language:"lang2"},{name:"name3",language:"lang3"}],Array2=[{name:"name1",subject:"sub1"},{name:"name2",subject:"sub2"},{name:"name3",subject:"sub3"}];

const a1Map = new Map(Array1.map(({name, ...r})=> [name, {...r}]));
const res = Array2.map(({name, ...r}) => ({...r, ...a1Map.get(name)}))
console.log(res)

您需要对两个数组进行迭代,并将生成的对象分组到名称为key:的映射中

let Array1 = [
{name: "name1", language: "lang1"}, 
{name: "name2", language: "lang2"}, 
{name: "name3", language: "lang3"}
];
let Array2 = [
{name: "name1", subject: "sub1"}, 
{name: "name2", subject: "sub2"}, 
{name: "name3", subject: "sub3"}
];

let map = new Map();
Array1.forEach(e => map.set(e.name, {language: e.language}));
Array2.forEach(e => {
if(map.has(e.name))
map.set(e.name, {...map.get(e.name), subject: e.subject});
});
let Array3 = [...map.values()].filter(e => e.language && e.subject);
console.log(Array3);

是的,你的想法是正确的,你需要使用排序算法逻辑,我会说嵌套for循环也一样好。对于较大的数据集,由于需要从两个不同的数组中提取值,因此可以使用嵌套的for循环。

for(int i=0;i>array1.length();i++){
This can be use for first array
Define String x=",";
For second
for(int j=0;j>array2.length();j++)
{
Check if ( (","+j+",").contains(x)) then break;
If array1 name found in array 2, store array3 as you want 
Also Store value of j in x
Like x=x +j+",";
}}

这样,嵌套的for循环将跳过比较代码。上面的算法是原始的,但会大大降低复杂性。

最新更新