繁体   English   中英

如何使用javascript合并数组中的对象

[英]How to merge objects in an array using javascript

我想合并数组中存在的对象。

输入:

[
   { 
     "email": "abc@gmail.com",
     "date": "2020-01-24",
     "name": "bc",
     "details": [{id:"1"}] 
   }, 
   { 
     "email": "xyz@abc.in",
     "date": "2020-01-22",
     "name": "de",
     "details": [{id:"1"}] 
   },
   { 
     "email": "efg@gmail.com",
     "details": [{id:2}]
   },
   { 
     "name": "ab",
     "email": "abc@gmail.com",
     "details": [{"id":"3"}] 
   },
   { 
     "name": "",
     "email": "xyz@abc.in",
     "age": "", 
     "details": [{id:"4"}]
   },
   { 
     "name": "ef",
     "email": "xyz@abc.in",
     "age": "",
     "details":[{id:"4"}]
   },
   { 
     "name": "",
     "email": "xyz@abc.in",
     "age":"18",
     "details":[{id:"4"}]
   } 
]

我想基于电子邮件正则表达式列合并(如果我不知道该字段的名称,即它可以是电子邮件或邮件或任何其他名称)

(i)如果“id”内部详细信息相同并且电子邮件匹配,则需要进行行合并,即,如果第一行中的任何字段为空,则将其从第 2 行或第 3 行复制到第 1 行,然后删除相同的重复行“ID”。

(ii) 如果“id”内部详细信息不同且电子邮件相同,则将不同对象合并为单个对象。

请帮助我找到解决方案。

在 (ii) 条件下,合并具有不同 id 的列需要获取所有合并后的 id 的内部详细信息数组。

预期输出

[
   {
     "email":"abc@gmail.com",
     "date": "2017-01-24",   
     "name": "bc",
     "age":"19",
     "details":[
                 {id:"1"},
                 {id:"3"}
                ]
   },
   { 
     "email": "xyz@abc.in",
     "date": "2017-01-22",  
     "name" :"ef",
     "age":"",
     "details": [
                  {id:1},
                  {id:4}
                ]
   },
   { 
     "email": "efg@gmail.com",
     "date": "",
     "name": "",
     "age": "",
     "details": [
                  {id:2}
                ]
   }
]

根据您提供的列表,这可能是您的解决方案。

(i) 通过遍历 inputList 并检查 (n) 索引是否存在于 newList 中,它会创建一个新的 List 而不会重复发送电子邮件。

(ii)当电子邮件已知时,它将检查 id 是否在 newItem 中匹配(可找到)(newItem 是 newList 中的项目,其中电子邮件与 inputList 的(n)索引匹配)如果找到它'我继续。 如果不是,它会将项目添加到详细信息列表中。

 const list = [ { email: "abc@gmail.com", date: "2020-01-24", name: "bc", details: [{ id: "1" }], }, { email: "xyz@abc.in", date: "2020-01-22", name: "de", details: [{ id: "1" }], }, { email: "efg@gmail.com", details: [{ id: 2 }], }, { name: "ab", email: "abc@gmail.com", details: [{ id: "3" }], }, { name: "", email: "xyz@abc.in", age: "", details: [{ id: "4" }], }, { name: "ef", email: "xyz@abc.in", age: "", details: [{ id: "4" }], }, { name: "", email: "xyz@abc.in", age: "18", details: [{ id: "4" }], }, ]; const mergeList = (list) => { let newList = []; list.forEach((item) => { let isExist = false; newList.forEach((newItem) => { if (item.email === newItem.email) { isExist = true; if (!newItem.details.find((detail) => detail.id === item.details[0].id)) newItem.details.push(item.details[0]); return; } }); if (!isExist) { newList.push(item); } }); return newList; }; console.log(mergeList(list));

const mergeList = (list) => {
  let newList = [];
  list.forEach((item) => {
    let isExist = false;
    newList.forEach((newItem) => {
      if (item.email === newItem.email) {
        isExist = true;
        if (!newItem.details.find((detail) => detail.id === item.details[0].id))
          newItem.details.push(item.details[0]);
      }
    });
    if (!isExist) {
      newList.push(item);
    }
  });
  return newList;
};


  [1]: https://jsfiddle.net/wcd7t93g/2/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM