【问题标题】:Compare two arrays and connect it比较两个数组并连接它
【发布时间】:2019-10-20 20:54:39
【问题描述】:

我有两个数组typesdefaultTypes。我需要用默认值数组defaultTypes 显示types

 const types = [
    {
        Id: 2,
        Name: 'Some value here'
    },
    {
        Id: 3,
        Name: 'Some value here'
    },
    {
        Id: 4,
        Name: 'Some value here'
    }
 ];

 const defaultTypes = [
    {
        Id: 1,
        Name: 'Default value 1'
    },
    {
        Id: 2,
        Name: 'Default value 2'
    }
 ]

如果在types 中不存在某些默认类型(在这种情况下,types 数组中不存在 ID:1)。我需要将该对象添加到 types 数组中。 预期结果将是:

 const expectedTypes = [
    {
        Id: 1,
        Name: '-'
    },
    {
        Id: 2,
        Name: 'Some value here'
    },
    {
        Id: 3,
        Name: 'Some value here'
    },
    {
        Id: 4,
        Name: 'Some value here'
    }
 ]; 

ID 为 1 和 2 的对象总是需要在 expectedTypes 中。

【问题讨论】:

  • let arr3 = [...arr1, ...arr2] 数组合并。
  • 不是那个,看一下expectedTypes数组上的Name prop。
  • 您的数组是否有可能通过键->值映射转换为 JS 对象?然后你可以使用Object.assign() 简单地合并它们

标签: javascript arrays object filter foreach


【解决方案1】:

您可以使用Map 减少所需顺序中的元素并获取所有值作为结果。

const
    types = [{ Id: 2, Name: 'Some value here' }, { Id: 3, Name: 'Some value here' }, { Id: 4, Name: 'Some value here' }],
    defaultTypes = [{ Id: 1, Name: 'Default value 1' }, { Id: 2, Name: 'Default value 2' }],
    result = Array.from([...defaultTypes, ...types]
        .reduce((m, o) => m.set(o.Id, Object.assign({}, m.get(o.Id), o)), new Map)
        .values()
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:
    • 您可以先使用map() 创建一个Set,其中将包含types 中的元素。
    • 然后循环遍历defaultTypes 并检查Set 是否包含Id。如果没有,则将push() 发送到types
    • 最后使用sort()Id对元素进行排序

    const types = [ { Id: 2, Name: 'Some value here' }, { Id: 3, Name: 'Some value here' }, { Id: 4, Name: 'Some value here' } ]; 
    const defaultTypes = [ { Id: 1, Name: 'Default value 1' }, { Id: 2, Name: 'Default value 2' } ]
    
    let ids = new Set(types.map(x => x.Id));
    
    defaultTypes.forEach(x => {
      if(!ids.has(x.Id)) types.push(x)
    })
    types.sort((a,b) => a.Id - b.Id)
    console.log(types)

    Set的目的

    Set 的目的是使时间复杂度线性化O(n)。如果您不使用Set,则需要在每个循环中的types 上使用some()。所以时间复杂度是O(m*n)

    Set.prototype.has 的时间复杂度为O(1)

    【讨论】:

      【解决方案3】:

      使用此代码并尝试

      var _ = require('lodash');
      defaultTypes.forEach(type => {
        if (!_.find(types, { Id: type.Id })) {
          types.push({ Id: type.Id, Name: '-' });
        }
      });
      

      【讨论】:

        【解决方案4】:
        const expectedTypes = types.concat(
          defaultTypes.filter(
            type => !types.some(t => t.Id == type.Id)
          ));
        

        解释:基本上你想要的是types + defaultTypes 中已经不在types 中的东西。

        【讨论】:

          【解决方案5】:

          试试这个:

          let types = [{
              Id: 2,
              Name: 'Some value here'
            },
            {
              Id: 3,
              Name: 'Some value here'
            },
            {
              Id: 4,
              Name: 'Some value here'
            }
          ];
          
          const defaultTypes = [{
              Id: 1,
              Name: 'Default value 1'
            },
            {
              Id: 2,
              Name: 'Default value 2'
            }
          ];
          
          defaultTypes.forEach(dt => {
            if (!types.some(t => t.Id === dt.Id)) {
              types.push(dt);
            }
          });
          
          types = types.sort((a, b) => a.Id - b.Id);
          console.log(types);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-07-03
            • 1970-01-01
            • 2013-09-08
            • 1970-01-01
            • 2020-03-16
            • 2013-11-26
            • 1970-01-01
            • 2017-11-22
            相关资源
            最近更新 更多