代码之家  ›  专栏  ›  技术社区  ›  arunmmanoharan

检查合并数组是否有来自两个数组的项,并更新合并数组

  •  1
  • arunmmanoharan  · 技术社区  · 6 年前

    我有两个数组。我将其合并并删除重复项。合并是通过考虑数组的所有键来完成的(数组1中对象的所有键值必须与数组2中的键值匹配)。

    var result1 = [{
        name: 'Sandra',
        email: 'sandra@example.com'
      },
      {
        name: 'John',
        email: 'johnny@example.com'
      },
      {
        name: 'Peter',
        email: 'peter@example.com'
      },
      {
        name: 'Bobby',
        email: 'bobby@example.com'
      },
      {
        name: 'Arun',
        email: 'arun@gmail.com'
      },
    ];
    
    var result2 = [{
        name: 'John',
        email: 'johnny@example.com'
      },
      {
        name: 'Bobby',
        email: 'bobby@example.com'
      },
      {
        name: 'Arun',
        email: 'arun@example.com'
      }
    ];
    
    var result= _.uniqWith(_.concat(result1, result2), _.isEqual)
    

    所以我的最终结果应该是这样。

    var result = [{
        name: 'Sandra',
        email: 'sandra@example.com',
        presentInA: true,
        presentInB: false
      },
      {
        name: 'John',
        email: 'johnny@example.com',
        presentInA: true,
        presentInB: true
      },
      {
        name: 'Peter',
        email: 'peter@example.com',
        presentInA: true,
        presentInB: false
      },
      {
        name: 'Bobby',
        email: 'bobby@example.com',
        presentInA: true,
        presentInB: true
      },
      {
        name: 'Arun',
        email: 'arun@example.com',
        presentInA: false,
        presentInB: true
      },
      {
        name: 'Arun',
        email: 'arun@gmail.com',
        presentInA: true,
        presentInB: false
      }
    ];
    

    请给我建议。

    3 回复  |  直到 6 年前
        1
  •  2
  •   German Burgardt    6 年前

    你可以这样做

    result.map(
        per => ({
            name: per.name,
            email: per.email,
            presentInA: _.find(
                result1, (o) => o.nombre === per.nombre && o.email === per.email
            ) ? true : false,
            presentInB: _.find(
                result2, (o) => o.nombre === per.nombre && o.email === per.email
            ) ? true : false,
        })
    )
    
        2
  •  2
  •   lealceldeiro VonC    6 年前

    你可以的 iterate result 使用 _.some 为了检查里面的每个物体 result1 result2 (并设置相应的属性 presentInA presentInB ). 像这样:

    _.forEach(result, (obj) => {
       let presentInA = _.some(result1, obj);
       let presentInB = _.some(result2, obj);
       obj.presentInA = presentInA;
       obj.presentInB = presentInB;
    });
    

    var result1 = [{
        name: 'Sandra',
        email: 'sandra@example.com'
      },
      {
        name: 'John',
        email: 'johnny@example.com'
      },
      {
        name: 'Peter',
        email: 'peter@example.com'
      },
      {
        name: 'Bobby',
        email: 'bobby@example.com'
      },
    ];
    
    var result2 = [{
        name: 'John',
        email: 'johnny@example.com'
      },
      {
        name: 'Bobby',
        email: 'bobby@example.com'
      },
      {
        name: 'Arun',
        email: 'arun@example.com'
      }
    ];
    
    var result = _.uniqWith(_.concat(result1, result2), _.isEqual);
    
    _.forEach(result, (obj) => {
       let presentInA = _.some(result1, obj);
       let presentInB = _.some(result2, obj);
       obj.presentInA = presentInA;
       obj.presentInB = presentInB;
    });
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>
        3
  •  1
  •   Jonas Wilms    6 年前

     // Merges objects with the same name and email, sets the [arrName] property of the merged object to true
     // also takes an optional settings object for chaining
     function merge(arr, arrName, { hash = {}, result = [] } = {}) {
       for(const { name, email } of arr) {
          // Build up a hopefully unique key
         const key = name + "@" + email;
         // If its not in the hash yet, add it to the hash and the result
         if(!hash[key]) 
            result.push(hash[key] = { name, email });
         // then set the key
         hash[key][arrName] = true;
      }
      // allow chaining by exposing both hash and result
      return { hash, result, merge: (arr, arrName) => merge(arr, arrName, { hash, result }) };
     }
    

    可用于:

     const { result } = merge(result1, "presentInA").merge(result2, "presentInB");
    

    这是O(n),但假设电子邮件不包含两个@s。