基于值的两个对象数组的交集

intersection of two array of objects basis on the value

我有两个这样的数组:

  1. [{ 编号:123, 参考编号:"q1w2e3", 交易名称:"poke" }, { 编号:143, 参考编号:"w3e4r5", 交易名称:"mon" }]

  2. [ { 编号:456, 参考编号:"q1w2e3", 评分:5 }, { 编号:967, 参考编号:"w3e4r5", 评分:3.5 } ]

我想根据refNo合并它们。生成的数组如下所示:

[
  {
    id: 456,
    refNo: "q1w2e3",
    transactionName: "poke",
    rating: 5
  },
  {
    id: 967,
    refNo: "w3e4r5",
    transactionName: "mon",
    rating: 3.5
  }
]

这将是一对一的映射。两个数组中都不会出现重复的 refNo。

你可以选择类似的东西:

var arrayA = [{ id: 123, refNo: "q1w2e3", transactionName: "poke" }, { id: 143, refNo: "w3e4r5", transactionName: "mon" }];
var arrayB = [ { id: 456, refNo: "q1w2e3", rating: 5 }, { id: 967, refNo: "w3e4r5", rating: 3.5 } ];

var result = arrayA.map(function(itemA){
    var itemB = _.find(arrayB, function(x){
        return itemA.refNo === x.refNo;
    });

    return _.merge(itemA, itemB);
});

** 假设如果两个项目中存在相同的属性 - 来自第二个数组的项目将在合并中获胜。 Merge 来自 lodash。 lodash#merge

这可能对您有所帮助。

var array1  = [{ id: 123, refNo: "q1w2e3", transactionName: "poke" }, { id: 143, refNo: "w3e4r5", transactionName: "mon" }];

var array2 = [ { id: 456, refNo: "q1w2e3", rating: 5 }, { id: 967, refNo: "w3e4r5", rating: 3.5 } ];


for(var i = 0 ; i < array1.length ; i++) {
 var tempRef = array1[i]['refNo'];
  
  for(var j = 0 ; j < array2.length ; j ++) {
   if(array2[j]['refNo'] === tempRef) {
     array1[i]['rating'] = array2[j]['rating'];
    }
  }
}

console.log(JSON.stringify(array1));

Object.assign , Array#map and Array#find方法

var arr1 = [{
  id: 123,
  refNo: "q1w2e3",
  transactionName: "poke"
}, {
  id: 143,
  refNo: "w3e4r5",
  transactionName: "mon"
}];
arr2 = [{
  id: 456,
  refNo: "q1w2e3",
  rating: 5
}, {
  id: 967,
  refNo: "w3e4r5",
  rating: 3.5
}];

var arr3 = arr2
  // iterate over `arr2` and generate array
  // based on the it's element
  .map(function(v) {
    // create a new object and assign properties of both 
    // array object with same `refNo` property
    return Object.assign({},
      // find the object with same `refNo` property
      arr1.find(function(v1) {
        // set the condition for find
        return v1.refNo === v.refNo;
        // set `v` for extending object property
      }), v)
  })

console.log(arr3);

这可能会有所帮助。添加了一些注释来解释这些步骤。

var arr1 = [{ id: 123, refNo: "q1w2e3", transactionName: "poke" }, { id: 143, refNo: "w3e4r5", transactionName: "mon" }];
var arr2 = [ { id: 456, refNo: "q1w2e3", rating: 5 }, { id: 967, refNo: "w3e4r5", rating: 3.5 } ];
var resultArray = [];

for (var i = 0, len = arr2.length; i < len; i++) {
  // find in other array by 'refNo'
  var findByRef = arr1.filter(function(v) {
    return v.refNo === arr2[i].refNo; // Filter out the appropriate one
  });

  // merge result
  var merged = merge_options(findByRef[0], arr2[i]);
  // add merged to result array
  resultArray.push(merged);
}
// dump result array
console.log(resultArray);

// merge all attrs of two objects
function merge_options(obj1,obj2){
    var obj3 = {};
    for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }
    for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }
    return obj3;
}

为了减少从 O(n^2) 到 O(n) 遍历所有项目所需的时间,您可以使用键为 refNos 的对象。

像这样:

var uniqueRefNos = {};

var array1 = [ { id: 123, refNo: "q1w2e3", transactionName: "poke" }, { id: 143, refNo: "w3e4r5", transactionName: "mon" } ];
var array2 = [ { id: 456, refNo: "q1w2e3", rating: 5 }, { id: 967, refNo: "w3e4r5", rating: 3.5 } ];

for(var i = 0 ; i < array1.length ; i++){
    //add all objects in array1 to uniqueRefNos
    uniqueRefNos[array1[i].refNo] = array1[i];
}

for(var i = 0 ; i < array2.length ; i++){
    //check if key already exists
    var key = array2[i].refNo;
    if (uniqueRefNos.hasOwnProperty(key)) {
      //if it does add the remaining attributes replacing the previous values from array1
      for (var key2 in array2[i]) {
        if(array2[i].hasOwnProperty(key2)) {
          uniqueRefNos[key][key2] = array2[i][key2];
        }
      }
    } else {
        //if key doesn't exist add the whole object
        uniqueRefNos[array2[i].refNo] = array2[i];
    }
}

这会将所有内部对象放入一个对象中,您可以循环使用该对象并转储到另一个数组中:

var finalArray = [];
for (var key in uniqueRefNos) {
  if (uniqueRefNos.hasOwnProperty(key)) {
    finalArray.push(uniqueRefNos[key]);
  }
}