Arrays 合并两个数组以避免O(n^2)复杂性

Arrays 合并两个数组以避免O(n^2)复杂性,arrays,Arrays,给定两个数组,farmers和collections,我希望当集合中的farmer_id等于farmers中的id时,能够将farmer信息合并到每个集合中。如果集合中没有与farmer_id匹配的farmer id,则该集合应具有空farmer对象 const farmers = [{ id: 10, name: 'John Doe', email: 'jdoe@gmail.com' }, { id: 11,

给定两个数组,farmers和collections,我希望当集合中的farmer_id等于farmers中的id时,能够将farmer信息合并到每个集合中。如果集合中没有与farmer_id匹配的farmer id,则该集合应具有空farmer对象

const farmers = [{
        id: 10,
        name: 'John Doe',
        email: 'jdoe@gmail.com'
    },
    {
        id: 11,
        name: 'James Bond',
        email: 'james@gmail.com'
    }
]
结果应采用以下格式 这就是我能想到的,但我现在被卡住了

function mapper(farmers, collectors) {
    for (let k = 0; k < farmers.length; k++) {
        const idToFarmerInfo = {};
        idToFarmerInfo[farmers[k].id] = farmers[k];
        for (let j = 0; j < collectors.length; j++) {
            let mapper = idToFarmerInfo[collectors[j].farmer_id];
            farmers[mapper] = collectors[j]
        }
    }
    return farmers
}
函数映射器(农场主、收集器){
for(设k=0;k<0.length;k++){
常量idToFarmerInfo={};
idToFarmerInfo[farmers[k].id]=farmers[k];
for(设j=0;j<1.length;j++){
让mapper=idToFarmerInfo[collectors[j].farmer_id];
农民[制图员]=收藏家[j]
}
}
返乡农民
}
正如我试图避免N平方的O,但N平方的O的复杂性

您可以使用更具声明性的方法,并使用

const result=collections.map(collection=>{
返回{
收集
farmer:farmers.find(farmer=>collection.farmer_id==farmer.id)|{
};
});
控制台日志(结果);
上的演示

您可以使用更具声明性的方法,并使用

const result=collections.map(collection=>{
返回{
收集
farmer:farmers.find(farmer=>collection.farmer_id==farmer.id)|{
};
});
控制台日志(结果);
为了获得更好的性能,您可以在
复杂性
O(N)
的农民中创建
散列
,因为我们只对
农民
列表进行一次迭代

const farmers=[{id:10,姓名:'John Doe',电子邮件:'jdoe@gmail.com“},{id:11,姓名:'James Bond',电子邮件:'james@gmail.com' } ]; const collections=[{id:9,名称:'Book',farmer_id:10,日期:'June'},{id:10,名称:'Game',farmer_id:11,日期:'July'},{id:13,名称:'Car',farmer_id:10,日期:'August'},{id:11,名称:'Wristwatches',farmer_id:20,日期:'August'}]
var farmers\u hash=farmers.reduce((散列,项)=>{
散列[item.id]=项;
返回散列;
}, {});
console.log(farmers\u散列)
为了获得更好的性能,您可以创建农民的
散列
,其中
复杂性
O(N)
,因为我们只对
农民
列表进行一次迭代

const farmers=[{id:10,姓名:'John Doe',电子邮件:'jdoe@gmail.com“},{id:11,姓名:'James Bond',电子邮件:'james@gmail.com' } ]; const collections=[{id:9,名称:'Book',farmer_id:10,日期:'June'},{id:10,名称:'Game',farmer_id:11,日期:'July'},{id:13,名称:'Car',farmer_id:10,日期:'August'},{id:11,名称:'Wristwatches',farmer_id:20,日期:'August'}]
var farmers\u hash=farmers.reduce((散列,项)=>{
散列[item.id]=项;
返回散列;
}, {});

console.log(farmers\u散列)
您可以创建一个
地图
集合,以便通过
id
访问所需农民的
O(N)
。然后,映射在性能方面变得更快:

const unique = new Map(farmers.map(f=> [f.id, f]));

const result = collections.map(s => ({
    ...s, farmer_id: unique.get(s.farmer_id) || s.farmer_id
}))
现在
集合的映射具有复杂性
O(N)
。然而,别忘了总结制作独特农民的复杂性。总体复杂度为
O(N)+O(M)

例如:

const farmers=[{
id:10,
姓名:“约翰·多伊”,
电邮:'jdoe@gmail.com'
},
{
id:11,
名字:“詹姆斯·邦德”,
电邮:'james@gmail.com'
}
];
常量集合=[{
id:9,
名称:'书',
农民身份证号码:10,
日期:六月
},
{
id:10,
名称:'游戏',
农民身份证号码:11,
日期:七月
},
{
id:13,
名称:“汽车”,
农民身份证号码:10,
日期:八月
},
{
id:11,
名称:'手表',
农民身份证号码:20,
日期:八月
}
];
const unique=newmap(farmers.Map(f=>[f.id,f]);
const result=collections.map(s=>({
…s,farmer_id:unique.get(s.farmer_id)| s.farmer_id
}))

控制台日志(结果)
您可以创建一个
地图
集合,以便通过
id
访问所需农民的
O(N)
。然后,映射在性能方面变得更快:

const unique = new Map(farmers.map(f=> [f.id, f]));

const result = collections.map(s => ({
    ...s, farmer_id: unique.get(s.farmer_id) || s.farmer_id
}))
现在
集合的映射具有复杂性
O(N)
。然而,别忘了总结制作独特农民的复杂性。总体复杂度为
O(N)+O(M)

例如:

const farmers=[{
id:10,
姓名:“约翰·多伊”,
电邮:'jdoe@gmail.com'
},
{
id:11,
名字:“詹姆斯·邦德”,
电邮:'james@gmail.com'
}
];
常量集合=[{
id:9,
名称:'书',
农民身份证号码:10,
日期:六月
},
{
id:10,
名称:'游戏',
农民身份证号码:11,
日期:七月
},
{
id:13,
名称:“汽车”,
农民身份证号码:10,
日期:八月
},
{
id:11,
名称:'手表',
农民身份证号码:20,
日期:八月
}
];
const unique=newmap(farmers.Map(f=>[f.id,f]);
const result=collections.map(s=>({
…s,farmer_id:unique.get(s.farmer_id)| s.farmer_id
}))

控制台日志(结果)你“卡住”的具体原因是什么?我注意到我可以使用地图通过集合的famer_id提取farmer对象。但是我正在寻找一种方法,将提取的农民添加到集合中,就像上面的结果数组一样。提前感谢您关于这件事的具体内容是什么?我注意到我可以使用地图通过收藏的famer_id提取farmer对象。但是我正在寻找一种方法,将提取的农民添加到集合中,就像上面的结果数组一样。提前感谢如果查找方法基于二进制搜索,则此解决方案的复杂性为
O(M*N*logN)
如果查找方法基于二进制搜索,则此解决方案的复杂性为
O(M*N*logN)
如果查找方法基于二进制搜索,则应为farmers.find(farmer=>collection.farmer\u id==farmer.id),应该是farmers.find(farmer=>collection.farmer\u id==farmer.id)谢谢,这是ve
const unique = new Map(farmers.map(f=> [f.id, f]));

const result = collections.map(s => ({
    ...s, farmer_id: unique.get(s.farmer_id) || s.farmer_id
}))