Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中通过多个键连接对象数组_Javascript_Join - Fatal编程技术网

在Javascript中通过多个键连接对象数组

在Javascript中通过多个键连接对象数组,javascript,join,Javascript,Join,我有两个对象数组: A = [ { id1: "1", id2: "a", p1: "3", p2: "4" }, { id1: "1", id2: "b", p1: "5", p2: "6" }, { id1: "2", id2: "a", p1: "7", p2: "8" }, { id1: "2", id2: "b", p1: "9", p2: "10" } ]; B = [ { id1: "1", id2: "a", p3: "13", p4:

我有两个对象数组:

A = [
    { id1: "1", id2: "a", p1: "3", p2: "4" },
    { id1: "1", id2: "b", p1: "5", p2: "6" },
    { id1: "2", id2: "a", p1: "7", p2: "8" },
    { id1: "2", id2: "b", p1: "9", p2: "10" }
];


B = [
    { id1: "1", id2: "a", p3: "13", p4: "14" },
    { id1: "1", id2: "b", p3: "15", p4: "16" },
    { id1: "2", id2: "a", p3: "17", p4: "18" },
    { id1: "2", id2: "b", p3: "19", p4: "20" }
];
我需要一个函数,该函数基于两个属性
id1
id2
在两个对象之间进行内部连接,使其他属性合并(除了
id1
id2
,属性名称永远不相等) 换句话说,因此我需要:

C = [
    { id1: "1", id2: "a", p1: "3", p2: "4", p3: "13", p4: "14" },
    { id1: "1", id2: "b", p1: "5", p2: "6", p3: "15", p4: "16" },
    { id1: "2", id2: "a", p1: "7", p2: "8", p3: "17", p4: "18" },
    { id1: "2", id2: "b", p1: "9", p2: "10", p3: "19", p4: "20" }
];
在这里,我可以找到一种使用单个键进行连接的方法。 我需要多钥匙箱的扩展


您可以使用两个ID中的一个组合键基于一个数组进行查找,然后循环第二个数组,查找合并键,并使用
object.assign()
从这两个项创建一个新对象。这将允许您在不使用O(n²)解决方案的情况下为
B中的每个项目搜索
A

=[
{id1:“1”,id2:“a”,p1:“3”,p2:“4”},
{id1:“1”,id2:“b”,p1:“5”,p2:“6”},
{id1:“2”,id2:“a”,p1:“7”,p2:“8”},
{id1:“2”,id2:“b”,p1:“9”,p2:“10”}
]
设B=[{id1:“1”,id2:“a”,p3:“13”,p4:“14”},
{id1:“1”,id2:“b”,p3:“15”,p4:“16”},
{id1:“2”,id2:“a”,p3:“17”,p4:“18”},
{id1:“2”,id2:“b”,p3:“19”,p4:“20”}
]
让查找=A.reduce((对象,项)=>{
obj[`${item.id1}}{item.id2}`]=item//以id1\u id2形式的键
返回obj
}, {})
让合并=B.减少((arr,项目)=>{
if(查找[`${item.id1}}{item.id2}`]){
arr.push(Object.assign({},lookup[`${item.id1}}{${item.id2}`],item))
}
返回arr
}, [])

log(合并)
如果数组非常大,使用@MarkMeyer shows之类的查找可能是更好的选择。但是对于做简单映射的较小数组,数组spread&find可以很好地工作

正如@user11299053所指出的,这并不等同于内部 加入,也许是左加入,。。所以我会让它保持原样,它可能 有用。:)

常数A=[
{id1:“1”,id2:“a”,p1:“3”,p2:“4”},
{id1:“1”,id2:“b”,p1:“5”,p2:“6”},
{id1:“2”,id2:“a”,p1:“7”,p2:“8”},
{id1:“2”,id2:“b”,p1:“9”,p2:“10”}
];
常数B=[
{id1:“1”,id2:“a”,p3:“13”,p4:“14”},
{id1:“1”,id2:“b”,p3:“15”,p4:“16”},
{id1:“2”,id2:“a”,p3:“17”,p4:“18”},
{id1:“2”,id2:“b”,p3:“19”,p4:“20”}
];
const merged=B.map(项=>({
…A.找到(
f=>f.id1===item.id1&&f.id2===item.id2),
…项目
}));

console.log(合并)两个提供的答案都提供预期结果(内部连接,它应该只包含两个数据集的匹配项)

我对输入数组进行了一些扩展,以演示所提供答案和我的答案的输出差异:

const A=[
{id1:“1”,id2:“a”,p1:“3”,p2:“4”},
{id1:“1”,id2:“b”,p1:“5”,p2:“6”},
{id1:“2”,id2:“a”,p1:“7”,p2:“8”},
{id1:“2”,id2:“b”,p1:“9”,p2:“10”},
{id1:“3”,id2:“c”,p1:“1”,p2:“3”}
];
常数B=[
{id1:“1”,id2:“a”,p3:“13”,p4:“14”},
{id1:“1”,id2:“b”,p3:“15”,p4:“16”},
{id1:“2”,id2:“a”,p3:“17”,p4:“18”},
{id1:“2”,id2:“b”,p3:“19”,p4:“20”},
{id1:“4”,id2:“k”,p3:“11”,p4:“13”}
];
const innerJoined=A.reduce((结果,项A)=>{
const itemB=B.find(itemB=>itemB.id1==itemA.id1&&itemB.id2==itemA.id2);
if(itemB)result.push({…itemA,…itemB});
返回结果;
}, []);

console.log(innerJoined)扩展此代码的哪一部分遇到问题?能否确保对象文本有效,。。它帮助别人帮助你。关于那件事,我很抱歉。提供的代码仅适用于单个键。我需要把它扩展到多键的情况下,不客气。我必须承认,我昨天在回答问题时没有花足够的精力,因为我急于离开办公室。今天我修复了我的代码,它现在比公认的答案更整洁,效果也更明显。
速度明显更快
这是一个有趣的结果,理论上使用对象哈希查找应该会得到更好的结果。但我感觉是创建查找键减慢了速度。Array.find的时间复杂度为O(n),但现在看起来Javascript的速度太快了,几乎不再是什么东西了:)另外,我已经把你的代码做成了一个片段,它只是更好。与其单击
{}
图标,不如单击
图标。我的猜测是,由于使用了
some()
find()
这两种方法,我的代码会更快,因为它们在第一次匹配时都会停止迭代目标数组。感谢您将我的代码转换为可执行代码段,我已经从手机上编辑了我的帖子,无法使用它feature@user11299053你会如何修改你的代码,使之有一个外部连接呢?@MauroGentile:我想,那应该是这样的