在Javascript中加入多个键上的对象数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Javascript中加入多个键上的对象数组相关的知识,希望对你有一定的参考价值。

我有两个对象数组:

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" }
];

我需要一个函数,它基于两个属性id1id2在两个对象之间建立内部联接,使得其他属性的并集(属性名称永远不会相等,除了id1id2)换句话说,我需要作为结果:

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" }
];

在这里,我可以找到一种使用单个键进行连接的方法。我需要扩展多键情况。

http://learnjsdata.com/combine_data.html

答案

两者都提供了答案,不提供预期的结果(内连接应该只包含来自两个数据集的匹配项)。

我有一些扩展的输入数组,以展示提供的答案和我的输出的差异:

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"}
];

const 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((result, itemA) => {
  const itemB = B.find(itemB => itemB.id1 == itemA.id1 && itemB.id2 == itemA.id2);
  if(itemB) result.push({...itemA, ...itemB});
  return result;
}, []);

console.log(innerJoined);
另一答案

您可以使用来自两个ID的复合键基于一个数组进行查找,然后遍历第二个,查找合并的键,并使用Object.assign()从这两个项创建一个新对象。这将允许您制作列表而不需要在A中为每个项目搜索B的O(n²)解决方案

let 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"}
]

let 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"}
]
  
let lookup = A.reduce((obj, item) => {
  obj[`${item.id1}_${item.id2}`] = item // key in form of id1_id2
  return obj
}, {})

let merged = B.reduce((arr, item) => {
  if (lookup[`${item.id1}_${item.id2}`]) {
    arr.push(Object.assign({}, lookup[`${item.id1}_${item.id2}`], item))
  }
  return arr
}, [])

console.log(merged)
另一答案

如果数组非常大,则使用@MarkMeyer之类的查找显示 将 可能是更好的选择。但是对于做一个简单映射的较小数组,数组传播和查找工作正常。

正如@ user11299053所指出的,这不等同于内连接,也许是左连接,所以我会保留原样,它可能很有用。 :)

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"}
];

const 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(item => ({
  ...A.find(
    f => f.id1 === item.id1 && f.id2 === item.id2),
  ...item
}));

console.log(merged);

以上是关于在Javascript中加入多个键上的对象数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在网页中加入关闭窗口的按钮

javascript 数组,数组中加入新元素 push() ,unshift() 相当于Add()

同一主键上的EF多个外键关系

在JSP页面中加入JavaScript小程序的方法分别有哪两种?其语法格式为?

在Java中加入两个数组? [复制]

JavaScript 返回键上的jQuery选项卡按