【问题标题】:merge two arrays including some fields from each合并两个数组,包括每个数组的一些字段
【发布时间】:2018-02-18 15:28:23
【问题描述】:

我想使用 map 函数合并两个数组,想法是创建一个新数组,其中一些字段取自第一个数组,一些字段取自第二个数组。 条件是字段name

这里是列表 A:

[
    {"name": "tom", "id": "1", "date": "1654"},
    {"name": "jack", "id": "2", "date": "6544"},
    {"name": "sarah", "id": "3", "date": "987"},
    {"name": "william", "id": "4", "date": "654"},
    {"name": "ronaldo", "id": "5", "date": "12345"}
]

这里是列表 B:

[
    {"name": "tom", "age": "20", "school": "A", "password": "abcd"},
    {"name": "jack", "age": "25", "school": "B", "password": "1234"}
]

因此,它应该返回一个合并的版本,但只包含一些选定的字段:

[
    {"name": "tom", "age": "20", "school": "A", "exists": true, , "date": "1654"},
    {"name": "jack", "age": "25", "school": "B", "exists": true, "date": "6544"},
    {"name": "sarah", "age": "", "school": "", "exists": false, "date": "987"},
    {"name": "william", "age": "", "school": "", "exists": false, "date": "654"},
    {"name": "ronaldo", "age": "", "school": "", "exists": false, "date": "12345"}
]

这是我尝试使用 map 合并这两个数组,但不是很成功。有人可以帮我实现这一目标吗?

const alldata = listA.map(u => listB.filter(oo => u.name === oo.name));

【问题讨论】:

  • 你已经接近了。您只需要根据过滤器是真还是假,在映射函数中返回一个设置了真假的u。

标签: javascript arrays ecmascript-6


【解决方案1】:

我使用name 作为键来查找a 中的条目是否存在于b 中,并使用两个列表中的适当值创建了所需的列表。

a = [
    {"name": "tom", "id": "1", "date": "1654"},
    {"name": "jack", "id": "2", "date": "6544"},
    {"name": "sarah", "id": "3", "date": "987"},
    {"name": "william", "id": "4", "date": "654"},
    {"name": "ronaldo", "id": "5", "date": "12345"}
];
b=[
    {"name": "tom", "age": "20", "school": "A", "password": "abcd"},
    {"name": "jack", "age": "25", "school": "B", "password": "1234"}
];

c = a.map(a1 => {
      let b3 = b.find(b1=>b1.name === a1.name) || {};
      return {name: a1.name, age: b3.age || "", school: b3.school || "", exists: b3.name != undefined, date: a1.date}
   })
console.log(c)

【讨论】:

    【解决方案2】:

    有了这个答案,您不会创建新数组。

    let a = [{"name": "tom","id": "1","date": "1654"},{"name": "jack","id": "2","date": "6544"},{"name": "sarah","id": "3","date": "987"},{"name": "william","id": "4","date": "654"},{"name": "ronaldo","id": "5","date": "12345"}],
        b = [{"name": "tom","age": "20","school": "A","password": "abcd"},{"name": "jack","age": "25","school": "B","password": "1234"}];
    a.forEach((key, index)=>{
      let exists;
      b.forEach((bkey, bindex)=>{
        if(key.name==bkey.name){
          a[index] = {...a[index], ...b[bindex]};
          exists = bkey.age;
        }
      });
      a[index].exists = !!exists;
    });
    console.log(a);

    【讨论】:

      【解决方案3】:

      你很亲密。试试这个:

      let arrA = [
          {"name": "tom", "id": "1", "date": "1654"},
          {"name": "jack", "id": "2", "date": "6544"},
          {"name": "sarah", "id": "3", "date": "987"},
          {"name": "william", "id": "4", "date": "654"},
          {"name": "ronaldo", "id": "5", "date": "12345"}
      ];
      	
      let arrB = [
          {"name": "tom", "age": "20", "school": "A", "password": "abcd"},
          {"name": "jack", "age": "25", "school": "B", "password": "1234"}
      ];
      	
      let result = arrA.map(v => {
          let fr = arrB.filter(f => v.name == f.name ) ;
          let e = fr.length ? true : false;
          fr = fr.length ? fr[0] : {age: "", school: "", password: "" };
      	
          //Construct the format you want on the final array
          return  {
              name: v.name, 
              age: fr.age, 
              school: fr.school, 
              exists: e, 
              date: v.date
          }
      });
      	
      console.log( result );

      【讨论】:

        【解决方案4】:

        使用map创建新数组并使用filter从第二个元素中查找匹配的元素

        var a = [{
            "name": "tom",
            "id": "1",
            "date": "1654"
          },
          {
            "name": "jack",
            "id": "2",
            "date": "6544"
          },
          {
            "name": "sarah",
            "id": "3",
            "date": "987"
          },
          {
            "name": "william",
            "id": "4",
            "date": "654"
          },
          {
            "name": "ronaldo",
            "id": "5",
            "date": "12345"
          }
        ]
        var b = [{
            "name": "tom",
            "age": "20",
            "school": "A",
            "password": "abcd"
          },
          {
            "name": "jack",
            "age": "25",
            "school": "B",
            "password": "1234"
          }
        ]
        
        var c = a.map(function(item) {
          let d = b.filter(function(items) {
            return item.name === items.name;
          })
          if (d.length > 0) {
            item.age = d[0].age;
            item.school = d[0].school;
            item.password = d[0].password
          }
          return item;
        })
        console.log(c)

        【讨论】:

          【解决方案5】:
          const list1 = [
              {"name": "tom", "id": "1", "date": "1654"},
              {"name": "jack", "id": "2", "date": "6544"},
              {"name": "sarah", "id": "3", "date": "987"},
              {"name": "william", "id": "4", "date": "654"},
              {"name": "ronaldo", "id": "5", "date": "12345"}
          ];
          
          const list2 = [
              {"name": "tom", "age": "20", "school": "A", "password": "abcd"},
              {"name": "jack", "age": "25", "school": "B", "password": "1234"}
          ];
          
          const merged = list1.map(item => {
              const list2Match = list2.filter(i => i.name === item.name)[0];
              const obj = list2Match ? {school: list2Match.school, age: list2Match.age, exists: true} : { school: '', age: '', exists: false};
          
              return {school:obj.school, age: obj.age, exists: obj.exists, name: item.name, date: item.date };
          });
          

          【讨论】:

            猜你喜欢
            • 2017-04-01
            • 2022-12-06
            • 2013-11-08
            • 2014-02-27
            • 2021-07-16
            • 1970-01-01
            • 2022-01-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多