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

Javascript 基于值的两个对象数组的交集,javascript,arrays,underscore.js,Javascript,Arrays,Underscore.js,我有两个这样的阵列: [{ id:123, 参考编号:q1w2e3, 交易名称:poke }, { id:143, 参考编号:w3e4r5, 交易名称:mon }] [ { 身份证号码:456, 参考编号:q1w2e3, 评级:5 }, { id:967, 参考编号:w3e4r5, 评级:3.5 } ] 我想在参考号的基础上合并它们。生成的数组如下所示: [ { id: 456, refNo: "q1w2e3", transactionName: "poke",

我有两个这样的阵列:

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

[ { 身份证号码:456, 参考编号:q1w2e3, 评级:5 }, { id:967, 参考编号:w3e4r5, 评级:3.5 } ]

我想在参考号的基础上合并它们。生成的数组如下所示:

[
  {
    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

您可以选择以下选项:

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

这可能会对你有所帮助

var array1=[{id:123,refNo:q1w2e3,transactionName:poke},{id:143,refNo:w3e4r5,transactionName:mon}]; var array2=[{id:456,参考编号:q1w2e3,评级:5},{id:967,参考编号:w3e4r5,评级:3.5}]; forvar i=0;i<1.长度;i++{ var tempRef=array1[i]['refNo']; forvar j=0;j var array1=[{id:123,refNo:q1w2e3,transactionName:poke},{id:143,refNo:w3e4r5,transactionName:mon}]; var array2=[{id:456,参考编号:q1w2e3,评级:5},{id:967,参考编号:w3e4r5,评级:3.5}]; forvar i=0;i<1.长度;i++{ var tempRef=array1[i]['refNo']; forvar j=0;j 变量arr1=[{ id:123, 参考编号:q1w2e3, 交易名称:poke }, { id:143, 参考编号:w3e4r5, 交易名称:mon }]; arr2=[{ 身份证号码:456, 参考编号:q1w2e3, 评级:5 }, { id:967, 参考编号:w3e4r5, 评级:3.5 }]; var arr3=arr2 //迭代“arr2”并生成数组 //基于它的元素 .mapfunctionv{ //创建新对象并指定两者的属性 //具有相同'refNo'属性的数组对象 返回对象。赋值{}, //查找具有相同'refNo'属性的对象 arr1.findfunctionv1{ //设置查找的条件 返回v1.refNo==v.refNo; //为扩展对象属性设置'v' },v } console.logarr3 用什么样的方法来做

变量arr1=[{ id:123, 参考编号:q1w2e3, 交易名称:poke }, { id:143, 参考编号:w3e4r5, 交易名称:mon }]; arr2=[{ 身份证号码:456, 参考编号:q1w2e3, 评级:5 }, { id:967, 参考编号:w3e4r5, 评级:3.5 }]; var arr3=arr2 //迭代“arr2”并生成数组 //基于它的元素 .mapfunctionv{ //创建新对象并指定两者的属性 //具有相同'refNo'属性的数组对象 返回对象。赋值{}, //查找具有相同'refNo'属性的对象 arr1.findfunctionv1{ //设置查找的条件 返回v1.refNo==v.refNo; //为扩展对象属性设置'v' },v }
console.logarr3 这可能会有帮助。添加了一些注释来解释这些步骤

var arr1=[{id:123,refNo:q1w2e3,transactionName:poke},{id:143,refNo:w3e4r5,transactionName:mon}]; var arr2=[{id:456,参考编号:q1w2e3,评级:5},{id:967,参考编号:w3e4r5,评级:3.5}]; var resultArray=[]; 对于var i=0,len=arr2.length;i} 这可能会有帮助。添加了一些注释来解释这些步骤

var arr1=[{id:123,refNo:q1w2e3,transactionName:poke},{id:143,refNo:w3e4r5,transactionName:mon}]; var arr2=[{id:456,参考编号:q1w2e3,评级:5},{id:967,参考编号:w3e4r5,评级:3.5}]; var resultArray=[]; 对于var i=0,len=arr2.length;i} 要减少从^2到On循环所有项目所需的时间,可以使用关键帧为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];
    }
}

要减少从^2到On循环所有项目所需的时间,可以使用关键帧为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];
    }
}


id属性在这里不冲突吗?合并对象中要保留哪一个?当合并的两个对象的属性冲突时,合并的算法是什么?例如,您是如何选择id:456而不是id:123的?数组1将合并到数组2中,保持数组2的id不变,删除数组1的id。这里的id属性是否冲突?合并对象中要保留哪一个?当合并的两个对象的属性冲突时,合并的算法是什么?例如,您是如何选择id:456而不是id:123的?数组1将合并到数组2中,保持数组2的id不变,删除数组1的id。这里有一个问题。我得到的结果是itemB,而不是组合数组。不,它实际上是itemB扩展的itemA,因为某些原因extend不起作用。我尝试了loadash并使用了merge。那就行了。奇怪。。顺便说一句,extend也将与lodash一起使用这里有一个问题。我得到的结果是itemB,而不是组合数组。不,它实际上是itemB扩展的itemA,因为某些原因extend不起作用。我尝试了loadash并使用了merge。那就行了。奇怪。。顺便说一句,extend也将与lodash一起工作。我将以以下形式获取数据[{$\uuuuu:{strictMode:false,getter:{},waspluded:false,activepath:{path:false:{到底是什么?@phantomphoenix:哪个浏览器?我正在从mongoose模型获取数据。@phantomphoenix:我想您正在使用nodejs…..使用mdn文档中的polyfill选项作为方法…..另请参阅:我正在以以下形式获取数据[{$\uuuuuu:{stricmode:false,getters:{},waspluded:false,activepath:{path:{到底是什么?@phantomphoenix:哪个浏览器?我正在从mongoose模型获取数据。@phantomphoenix:我想您正在使用nodejs…..使用mdn文档中的polyfill选项作为方法…..另请参考: