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

javascript-按键映射3个对象数组

  •  1
  • xchrisbradley  · 技术社区  · 5 年前

    我有3组对象,1组可以通过一个唯一的键映射到相应的集合。同一个集合可以通过不同的键映射到第三个集合。我需要能够将所有这些映射到一个新的组合集。这些集合都有不同的属性。

    唯一计数[用户][扇区]
    许多计数[发票]

    每个唯一的[用户]都属于(comitid)找到的特定[扇区],但同一个[用户]可以有许多[发票]。一对多字段,如果您熟悉关系数据库

    const users= [ // Unique Entries
        {name:'user1', comitId: 'aa1'},
        {name:'user2', comitId: 'aa2'}
    ]
    
    const sector= [ // Unique Entries
        {comitID: 'aa1', department: 'finance'},
        {comitID: 'aa2', department: 'marketing'},
        {comitID: 'aa3', department: 'engineering'}
    ]
    
    const invoices= [ // Multiple Entries
        {name: 'user1' : statementDate: '2/1/2019'},
        {name: 'user1' : statementDate: '2/14/2019'},
        {name: 'user2' : statementDate: '2/1/2019'}
    ]
    

    新的一套应该是这样的。不能包含语句日期的列表,每个日期都需要是新对象。

    const results = [
        {name: 'user1', comitId: 'aa1', department: 'finance', statementDate: '2/1/2019'},
        {name: 'user1', comitId: 'aa1', department: 'finance', statementDate: '2/14/2019'},
        {name: 'user2', comitId: 'aa2', department: 'marketing', statementDate: '2/1/2019'}
    ]
    

    我一直在用excel和vlookups和公式来尝试这个。这些文件的唯一计数往往是10K,而发票则是40K。

    2 回复  |  直到 5 年前
        1
  •  1
  •   jo_va    5 年前

    你可以用 Array.map() 结束 invoices Array.find() 获取相应的条目 users 然后 sectors :

    const users = [ // Unique Entries
      {name:'user1', comitId: 'aa1'},
      {name:'user2', comitId: 'aa2'}
    ];
    
    const sectors = [ // Unique Entries
      {comitID: 'aa1', department: 'finance'},
      {comitID: 'aa2', department: 'marketing'},
      {comitID: 'aa3', department: 'engineering'}
    ];
    
    const invoices = [ // Multiple Entries
      {name: 'user1', statementDate: '2/1/2019'},
      {name: 'user1', statementDate: '2/14/2019'},
      {name: 'user2', statementDate: '2/1/2019'}
    ];
    
    const result = invoices.map(invoice => {
      const user = users.find(u => u.name === invoice.name) || {};
      const sector = sectors.find(s => s.comitID === user.comitId) || {};
      return { ...invoice, ...sector };
    });
    
    console.log(result);
        2
  •  0
  •   thopaw    5 年前

    我建议您对发票进行迭代,并用集合中具有唯一条目的条目来丰富条目。

    类似这样的东西(不测试代码,但我希望您能理解这个想法)

    const data = invoices
        .map(entry => {...entry, ...{
            users.find(user => user.name === entry.name)
                .map(user => {...user,
                    sector.find(sec=> sec.comitID === user.commitID)
                 })
            }}
         )
    

    当您首先从集合中创建映射,然后只查找连接属性而不是搜索它们时,可以提高速度

    const userMap = users.reduce((map, user) => {...map, ...{user.name: user}}, {})
    const sectorMap = sector.reduce((map, sec) => {...map, ...{sector.comitID: sec}}), {})
    
    const data = invoices.map(invoice => {...invoice, ...userMap[invoice.name], ...sector[userMap[invoice.name].comitID]})
    
        3
  •  0
  •   bennettbuchanan    5 年前

    这是一个基本的脚本,可以工作。

    const users = [ // Unique Entries
        {name:'user1', comitId: 'aa1'},
        {name:'user2', comitId: 'aa2'}
    ]
    
    const sectors = [ // Unique Entries
        {comitID: 'aa1', department: 'finance'},
        {comitID: 'aa2', department: 'marketing'},
        {comitID: 'aa3', department: 'engineering'}
    ]
    
    const invoices = [ // Multiple Entries
        {name: 'user1', statementDate: '2/1/2019'},
        {name: 'user1', statementDate: '2/14/2019'},
        {name: 'user2', statementDate: '2/1/2019'}
    ]
    
    sectors.forEach(sector => {
        const user = users.find(user => sector.comitID === user.comitId);
        if (user) {
            user.department = sector.department;
        }
    });
    
    const results = invoices.map(invoice => {
        const user = users.find(user => invoice.name === user.name);
        return Object.assign({}, user, { statementDate: invoice.statementDate });
    });
    
    console.log(results);
    
        4
  •  0
  •   brk    5 年前

    你可以用 map 和; filter

    const users = [ // Unique Entries
      {
        name: 'user1',
        comitId: 'aa1'
      },
      {
        name: 'user2',
        comitId: 'aa2'
      }
    ]
    
    const sector = [ // Unique Entries
      {
        comitID: 'aa1',
        department: 'finance'
      },
      {
        comitID: 'aa2',
        department: 'marketing'
      },
      {
        comitID: 'aa3',
        department: 'engineering'
      }
    ]
    
    const invoices = [ // Multiple Entries
      {
        name: 'user1',
        statementDate: '2/1/2019'
      },
      {
        name: 'user1',
        statementDate: '2/14/2019'
      },
      {
        name: 'user2',
        statementDate: '2/1/2019'
      }
    ]
    let newArray = invoices.map(function(item) {
      // this value will be use to find match between users & sectors
      let cId = users.filter(user => user.name === item.name)[0].comitId;
      return {
        name: item.name,
        statementDate: item.statementDate,
        comitId: cId,
        department: sector.filter(sector => sector.comitID === cId)[0].department
      }
    });
    
    console.log(newArray)
        5
  •  0
  •   Nina Scholz    5 年前

    如有必要,您可以将用户和扇区项移动到地图中并获取此对象。

    const
        users = [{ name: 'user1', comitId: 'aa1' }, { name: 'user2', comitId: 'aa2' }],
        sector = [{ comitID: 'aa1', department: 'finance' }, { comitID: 'aa2', department: 'marketing' }, { comitID: 'aa3', department: 'engineering' }],
        invoices = [{ name: 'user1', statementDate: '2/1/2019'}, { name: 'user1', statementDate: '2/14/2019' }, { name: 'user2', statementDate: '2/1/2019' }],
        setMap = k => (m, o) => m.set(o[k], o),
        userMap = users.reduce(setMap('name'), new Map),
        sectorMap = sector.reduce(setMap('comitID'), new Map),
        result = invoices.map(({ name, statementDate }) => {
            var { comitId } = userMap.get(name),
                { department } = sectorMap.get(comitId);
            return { name, comitId, department, statementDate };
        });
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }