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

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']
  }
];


现在,我需要以某种方式将此数组合并为一个,以便每个id仅存在一次。相同的键应该被替换,除了它是一个数组,然后我要它们添加/连接。因此,所需的结果应如下所示:

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])


有谁知道如何做到这一点?

最佳答案

您可以concat数组,然后使用idMap将所有具有相同Array.reduce()的项组合在一起。

若要将具有相同id的对象组合在一起,请从Map中获取对象。用Object.entries()迭代新的Array.forEach()。检查现有值是否为数组,如果没有分配该值。如果它是一个数组,请合并数组,并使用带有数组Setspread使项目唯一。

要将Map转换回数组,可以传播Map.values()迭代器。



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(salaries)
  .reduce((r, o) => {
    r.has(o.id) || r.set(o.id, {});

    const item = r.get(o.id);

    Object.entries(o).forEach(([k, v]) =>
      item[k] = Array.isArray(item[k]) ?
        [...new Set([...item[k], ...v])] : v
    );

    return r;
  }, new Map()).values()];

console.log(result);

关于javascript - JS(ES6):基于id合并数组并连接子数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49649360/

10-14 23:49
查看更多