Javascript JS(ES6):基于id合并数组并连接子数组

Javascript JS(ES6):基于id合并数组并连接子数组,javascript,arrays,merge,ecmascript-6,array-merge,Javascript,Arrays,Merge,Ecmascript 6,Array Merge,我有两个数组,如下所示: const persons = [ { id: 1, name: 'Peter', job: 'Programmer' }, { id: 2, name: 'Jeff', job: 'Architect' }, ]; const salaries = [ { id: 1, salary: 3000, departments: ['A', 'B'] }, { i

我有两个数组,如下所示:

const persons = [
  {
    id: 1,
    name: 'Peter',
    job: 'Programmer'
  },
  {
    id: 2,
    name: 'Jeff',
    job: 'Architect'
  },
];

const salaries = [
  {
    id: 1,
    salary: 3000,
    departments: ['A', 'B'] 
  },
  {
    id: 1,
    salary: 4000,
    departments: ['A', 'C']
  },
  {
    id: 2,
    salary: 4000,
    departments: ['C', 'D']
  }
];
const result = [
  {
    id: 1,
    name: 'Peter',
    job: 'Programmer',
    salary: 4000,
    departments: ['A', 'B', 'C'] 
  },
  {
    id: 2,
    name: 'Jeff',
    job: 'Architect',
    salary: 4000,
    departments: ['C', 'D']
  }
];
现在我需要以某种方式将这个数组合并到一个数组中,这样每个id只存在一次。应该替换相同的键,除非它是一个数组,然后我希望它们添加/concat。所以期望的结果应该是这样的:

const persons = [
  {
    id: 1,
    name: 'Peter',
    job: 'Programmer'
  },
  {
    id: 2,
    name: 'Jeff',
    job: 'Architect'
  },
];

const salaries = [
  {
    id: 1,
    salary: 3000,
    departments: ['A', 'B'] 
  },
  {
    id: 1,
    salary: 4000,
    departments: ['A', 'C']
  },
  {
    id: 2,
    salary: 4000,
    departments: ['C', 'D']
  }
];
const result = [
  {
    id: 1,
    name: 'Peter',
    job: 'Programmer',
    salary: 4000,
    departments: ['A', 'B', 'C'] 
  },
  {
    id: 2,
    name: 'Jeff',
    job: 'Architect',
    salary: 4000,
    departments: ['C', 'D']
  }
];
我已经试过:

// double id's, arrays get replaced
Object.assign({}, persons, salaries)

// loadsh: double id's, arrays get concatenated
_.mergeWith(persons, salaries, (objValue, srcValue) => {
    if (_.isArray(objValue)) {
        return objValue.concat(srcValue);
    }
});

// gives me a map but replaces arrays
new Map(salaries.map(x => [x.id, x])

有人知道如何实现这一点吗?

您可以使用
映射
迭代所有属性,并检查类型以向数组添加唯一值

var persons=[{id:1,名称:'Peter',作业:'Programmer'},{id:2,名称:'Jeff',作业:'Architect'}],
工资=[{id:1,工资:3000,部门:['A','B']},{id:1,工资:4000,部门:['A','C']},{id:2,工资:4000,部门:['C','D']},
结果=Array.from(
薪水
.减少(
(m,o)=>{
var t=m.get(o.id)|{};
Object.keys(o.forEach)(k=>{
if(Array.isArray(o[k])){
t[k]=t[k]| |[];
o[k]。forEach(v=>t[k]。包括(v)| | t[k]。推(v));
}else如果(t[k]!==o[k]){
t[k]=o[k];
}
});
返回m;
},
persons.reduce((m,o)=>m.set(o.id,Object.assign({},o)),新映射)
)
.values()
);
控制台日志(结果)
.as console wrapper{max height:100%!important;top:0;}
您可以使用数组,然后使用和组合具有相同
id
的所有项

要组合具有相同id的对象,请从地图中获取对象。使用迭代新的。检查现有值是否为数组,如果不是,则指定值。如果是数组,请组合数组,并使用with数组使项目唯一

要将映射转换回数组,可以扩展迭代器

const persons=[{“id”:1,“name”:“Peter”,“job”:“Programmer”},{“id”:2,“name”:“Jeff”,“job”:“Architect”}];
const salaries=[{“id”:1,“salary”:3000,“departments”:[“A”,“B”]},{“id”:1,“salary”:4000,“departments”:[“A”,“C”]},{“id”:2,“salary”:4000,“departments”:[“C”,“D”]};
const result=[…persons.concat(工资)
.减少((r,o)=>{
r、 has(o.id)|r.set(o.id,{});
const item=r.get(o.id);
Object.entries(o.forEach)([k,v])=>
项[k]=数组.isArray(项[k])?
[…新集合([…项[k],…v])]:v
);
返回r;
},新映射())。值()];
控制台日志(结果)您可以使用、和来实现所需的结果

演示

const persons=[{
id:1,
姓名:'彼得',
工作:“程序员”
}, {
id:2,
姓名:“杰夫”,
工作:“建筑师”
}],
薪金=[{
id:1,
工资:3000,
部门:['A','B']
}, {
id:1,
工资:4000,
部门:['A','C']
}, {
id:2,
工资:4000,
部门:['C','D']
}];
让输出=persons.map(obj=>{
让filter=salaries.filter(v=>v.id==obj.id);
如果(过滤器){
让departments=filter.reduce((r,v)=>[…v.departments,…r],]);
对象分配(obj{
薪资:筛选器[filter.length-1]。薪资,
部门:部门.filter((项目,位置)=>departments.indexOf(项目)==pos.sort()
});
}
返回obj;
});

console.log(output)
我会给你一个提示,根据id对这两个数组进行排序,然后尝试比较Em,了解应该取哪一个薪水的逻辑是什么?最新的?薪水最高?@MiguelAngel最晚你能帮我吗?