根据键值比较合并两个对象数组

sup*_*oda 2 javascript arrays object node.js

我正在尝试合并两个具有相同相似键但不同值的对象。我希望他们保留不同的键,但将它们放在匹配的键值中

\n

这是我的第一个对象,

\n
const obj1 = [\n      {\n        "p_id": 1,\n        "name": "Peter",\n        "status" : "Active"\n      },\n      {\n        "p_id": 2,\n        "name": "Kane",\n        "status" : "Active"\n      },\n      {\n        "p_id": 3,\n        "name": "William",\n        "status" : "Inactive"\n      }\n]\n\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我的第二个目标,

\n
const obj2 = [\n  { p_id: 1, type: 'home', no: '+01 234 5678' },\n  { p_id: 1, type: 'work', no: '+09 111 2223' },\n  { p_id: 2, type: 'home', no: '+12 345 6789' },\n]\n
Run Code Online (Sandbox Code Playgroud)\n

事实上我做了这样的事情

\n
 obj1.forEach((item) => {\n            Object.assign(item, {\n                phone: obj2.find(\n                    (o) => o.p_id === item.p_id\n                )\n            });\n        });\n// console.log(obj1) would be\n\n[\n      {\n        "p_id": 1,\n        "name": "Peter",\n        "status" : "Active",\n        "phone" : {type: 'home', no: '+01 234 5678'}       \n      },\n      {\n        "p_id": 2,\n        "name": "Kane"\n        "status" : "Active",\n        "phone" : {type: 'home', no: '+12 345 6789'} \n      },\n      {\n        "p_id": 3,\n        "name": "William"\n        "status" : "Inactive"\n        "phone" : undefined\n      }\n\n]\n\n
Run Code Online (Sandbox Code Playgroud)\n

但这不是我想要的。我想要的是最终结果,我需要的是这些数组 \xe2\x80\x93 之间的比较,最终结果应该是这样的:

\n
const result = [\n      {\n        "p_id": 1,\n        "name": "Peter",\n        "status" : "Active",\n        "phone" : [\n           {type: 'home', no: '+01 234 5678'},\n           {type: 'work', no: '+09 111 2223'}        \n        ]\n      },\n      {\n        "p_id": 2,\n        "name": "Kane"\n        "status" : "Active",\n        "phone" : [\n           {type: 'home', no: '+12 345 6789'}      \n        ]\n      },\n      {\n        "p_id": 3,\n        "name": "William"\n        "status" : "Inactive"\n        "phone" : []\n      }\n\n]\n\n
Run Code Online (Sandbox Code Playgroud)\n

非常感谢您的帮助,\n谢谢!

\n

Man*_*wal 5

你可以这样做:

const users = [
  {
    p_id: 1,
    name: "Peter",
    status: "Active",
  },
  {
    p_id: 2,
    name: "Kane",
    status: "Active",
  },
  {
    p_id: 3,
    name: "William",
    status: "Inactive",
  },
];

const phoneNumbers = [
  { p_id: 1, type: "home", no: "+01 234 5678" },
  { p_id: 1, type: "work", no: "+09 111 2223" },
  { p_id: 2, type: "home", no: "+12 345 6789" },
];

const mergeArrays = (arr1, arr2) => {
  return arr1.map((obj) => {
    const numbers = arr2.filter((nums) => nums["p_id"] === obj["p_id"]);
    if (!numbers.length) {
      obj.phone = numbers;
      return obj;
    }
    obj.phone = numbers.map((num) => ({ type: num.type, no: num.no }));
    return obj;
  });
};

const result = mergeArrays(users, phoneNumbers);
console.log(result);
Run Code Online (Sandbox Code Playgroud)

解释:

使用该filter方法查找phoneNumbers数组中具有相同 id 的所有对象。map然后在匹配的电话号码上使用该方法循环并返回不带 id 的电话号码对象。