Javascript 基于值的两个对象数组的交集
我有两个这样的阵列: [{ id:123, 参考编号:q1w2e3, 交易名称:poke }, { id:143, 参考编号:w3e4r5, 交易名称:mon }] [ { 身份证号码:456, 参考编号:q1w2e3, 评级:5 }, { id:967, 参考编号:w3e4r5, 评级:3.5 } ] 我想在参考号的基础上合并它们。生成的数组如下所示: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: 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;jconsole.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 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选项作为方法…..另请参考: