【问题标题】:How to combine two array objects if a key value matches in both arrays如果两个数组中的键值匹配,如何组合两个数组对象
【发布时间】:2017-02-11 23:35:24
【问题描述】:

我正在尝试根据飞行键将两个数组对象与不同的数组对象组合在一起。
如果值在a2 中匹配,我想将它与a1 合并并创建新数组。
a1 中的所有数据都必须存在,并且必须将匹配的航班详细信息从 a2 添加到 a1

请帮我解决这个问题。

a1 = [{'flight':'AF1223','oring':'CDF', 'Dest':'HNG'},{'flight':'XG23','oring':'HYD', 'Dest':'MMZ'},{'flight':'PK145','oring':'XYZ', 'Dest':'PEK'}]

a2 = [{'price':230,'avail':20,'flight':'AF1223'}, {'price':430,'avail':30,'flight':'DF43'},{'price':430,'avail':30,'flight':'XG23'} ]

combine array = [{'flight':'AF1223','oring':'CDF', 'Dest':'HNG','price':230,'avail':20},{'flight':'XG23','oring':'HYD', 'Dest':'MMZ'},{'flight':'PK145','oring':'XYZ', 'Dest':'PEK','price':430,'avail':30,}]

【问题讨论】:

  • 你有没有尝试过,或者只是订购了一个代码?
  • @LouysPatriceBessette 我是编码新手并试图动手,据我所知,我尝试过很少但没有工作,因此请求帮助
  • @ChadMcGrath 在我提出这个问题之前我检查了那个,我需要一种方法来检查值是否匹配,如果匹配则只加入 a1,否则保持原样。

标签: javascript jquery arrays merge javascript-objects


【解决方案1】:

我给你一个完整的解决方案。

a = [
  {'id':'A','oring':'CDF', 'Dest':'HNG'},
  {'id':'B','oring':'HYD', 'Dest':'MMZ'},
  {'id':'C','oring':'XYZ', 'Dest':'PEK'}];

b = [
  {'id':'A','price':230,'avail':20,}, 
  {'id':'D','price':430,'avail':30},
  {'id':'B','price':430,'avail':30} ];

// put the object D into array a
for(var i=0;i<b.length;i++) {
  var idb = b[i].id;
  var idnotfound = true;
  a.forEach(function(rowofa) {
    var ida = rowofa.id;
    if(ida == idb) {
      idnotfound = false;
    }
  });
  if(idnotfound){
    a.push(b[i]);
  }
}//for
//console.log('aa=>>',a);
//.......................................

//Match ids and then put all in array a

for(var i= 0;i<a.length;i++) {
  var ida = a[i].id;
  for(var j=0;j<b.length;j++) {
    var idb = b[j].id;
    if(ida == idb) {
      a[i].avail = b[j].avail;
      a[i].price = b[j].price;
    }//if
  } //for2
}//for1
console.log('aa=>',a);

输出将是

aa=> [ { id: 'A', oring: 'CDF', Dest: 'HNG', avail: 20, price: 230 },
       { id: 'B', oring: 'HYD', Dest: 'MMZ', avail: 30, price: 430 },
       { id: 'C', oring: 'XYZ', Dest: 'PEK' },
       { id: 'D', price: 430, avail: 30 } ]

【讨论】:

  • 欢迎来到 Stack Overflow。不鼓励仅使用代码的答案,因为它们没有解释如何解决问题中的问题。考虑更新您的答案以解释它的作用以及它如何解决问题 - 这不仅有助于 OP,还有助于其他有类似问题的人。请查看How do I write a good answer
【解决方案2】:

您可以遍历两个数组,如果匹配从 array2 到 array1 的推送对象,类似于..

var a1 = [{'flight':'AF1223','oring':'CDF', 'Dest':'HNG'},{'flight':'XG23','oring':'HYD', 'Dest':'MMZ'},{'flight':'PK145','oring':'XYZ', 'Dest':'PEK'}];

var a2 = [{'price':230,'avail':20,'flight':'AF1223'}, {'price':430,'avail':30,'flight':'DF43'},{'price':430,'avail':30,'flight':'XG23'} ];

var result = a1.slice(0);

for (var i = 0 ; i < result.length ; i++){
  for (var j = 0; j < a2.length ; j++){
    if (result[i].flight == a2[j].flight){
      result[i].price = a2[j].price;
      result[i].avail = a2[j].avail;
    }
  };  
};
console.log(result);

【讨论】:

  • 也许Object.assign(a, b) 会更接近所需的解决方案? (或合并两个对象的任何其他方式。)当然这会改变a1,因此可以创建另一个组合的数组,然后是(匹配时)combined.push(Object.assign({}, a, b));
  • @Lucas Costa,谢谢你的帮助,但结果不是我想要得到的,如果你看到示例第一个对象的组合数组将有 5 个键值对,它们由由于航班号匹配,a1 和 a2 的组合和第二个对象将只是 3 个键值对,因为没有航班号匹配。
  • 感谢@DawsonToth 的建议,我同意你和 Redu 的意见,他们来自Object.assign
  • 请注意,这仍然会改变a1,因为result = a1 是通过引用原始数组进行的赋值。 result = a1.slice(0) 将保持 a1 不变。
  • 谢谢@DawsonToth
【解决方案3】:

要匹配您想要的输出,您可以执行以下操作;

var a1 = [{'flight':'AF1223','oring':'CDF', 'Dest':'HNG'},{'flight':'XG23','oring':'HYD', 'Dest':'MMZ'},{'flight':'PK145','oring':'XYZ', 'Dest':'PEK'}],
    a2 = [{'price':230,'avail':20,'flight':'AF1223'}, {'price':430,'avail':30,'flight':'DF43'},{'price':430,'avail':30,'flight':'XG23'}],
result = a2.reduce((p,c) => (p[c.flight] && (p[c.flight] = Object.assign(p[c.flight],c)),p), a1.reduce((f,s) => (f[s.flight] = s,f),{}));
console.log(result);

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    相关资源
    最近更新 更多