问题描述
var arrayOne = [{id: 1,name: 'A'},{id:2,name: 'B'},{id:3,name: 'C'},{id:4,name: 'D'},{id:5,name: 'E'}];
var arrayTwo = [{id: 1,basis: 'Online'},basis: 'Paper'},basis: 'Referrer'}];
一个结果应该是:
var combinedArray = [{id: 1,name: 'A',name: 'B',basis: 'Default'},name: 'C',name: 'D',basis: 'Referrer'},name: 'E',basis: 'Default'}];
能否得到数组的其他结果,该结果从拳头数组中删除名称,如下所示?
var combinedArray2 = [{id: 1,basis: 'Default'}];
我尝试过
var combinedArray = [];
arrayOne.forEach(objOne => {
arrayTwo.forEach(objTwo => {
if(objOne.id === ObjTwo.id){
combinedArray.push({...objOne,...objTwo});
}
});
});
是否有任何简单的方法和更快的方法来获得结果数组,而无需重复两次以提高性能
解决方法
另一种方法是使用id作为键创建基值的映射,并在第一个数组的映射中查找这些值
const bMap = new Map(arr2.map(e => [e.id,e.basis]))
const res = arr1.map(e => ({...e,basis : bMap.get(e.id) || 'Default' }))
console.log(res)
<script>
var arr1 = [{id: 1,name: 'A'},{id:2,name: 'B'},{id:3,name: 'C'},{id:4,name: 'D'},{id:5,name: 'E'}];
var arr2 = [{id: 1,basis: 'Online'},basis: 'Paper'},basis: 'Referrer'}];
</script>
,
这是另一种方法:
var arrayOne = [{id: 1,name: 'E'}];
var arrayTwo = [{id: 1,basis: 'Referrer'}];
function groupArrays(arr1,arr2){
return arr1.map(e => {
let element = arr2.find(elem=>elem.id==e.id);
e['basis'] = element?element['basis']:'Default';
return e;
});
}
console.log(groupArrays(arrayOne,arrayTwo));
,
O(constant * n) ~ O(n)
的复杂度(其中n
是级联数组的长度)
const arrayOne = [
{ id: 1,name: "A" },{ id: 2,name: "B" },{ id: 3,name: "C" },{ id: 4,name: "D" },{ id: 5,name: "E" },]
const arrayTwo = [
{ id: 1,basis: "Online" },basis: "Paper" },basis: "Referrer" },]
const lookup = {}
const concatArray = arrayOne.concat(arrayTwo)
concatArray.forEach((obj) => {
lookup[obj.id] = { id: obj.id,...lookup[obj.id],basis: "Default",...obj }
})
const res = Object.values(lookup)
console.log(res)
,
在O(n + m)时间复杂度和O(n + m)空间复杂度中。
var arrayOne = [{id: 1,basis: 'Referrer'}];
var obj = {};
arrayOne.forEach(({id,name}) => {
obj[id] = {id,name,basis: 'Default'};
});
arrayTwo.forEach(({id,basis}) => {
obj[id].basis = basis;
});
let result = Object.values(obj);
console.log(result);
,
这是可以同时做到的解决方案。
var arrayOne = [{id: 1,basis: 'Referrer'}];
var combinedArray = arrayOne.map(({id,basis = 'Default'}) => {
arrayTwo.some(obj => (obj.id == id) && (basis = obj.basis));
return { id,basis }; //With Name
// return { id,basis }; //Without Name
});
console.log(combinedArray);
// var combinedArray = [{id: 1,name: 'A',name: 'B',basis: 'Default'},name: 'C',name: 'D',basis: 'Referrer'},name: 'E',basis: 'Default'}];
,
如果第二个数组中每个id只有一个对象,则可以
var combinedArray = arrayOne.map(objOne => {
let objTwo = arrayTwo.find(objTwo => {
return objTwo.id === objOne.id
});
return {
basis: 'default',...objOne,...objTwo
}
});