【问题标题】:Map 3 arrays of objects by key in JavaScript在 JavaScript 中按键映射 3 个对象数组
【发布时间】:2019-03-08 20:14:43
【问题描述】:

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

唯一计数[用户][部门]
许多计数[发票]

每个唯一的 [user] 都属于 (comitID) 找到的特定 [sector],但同一个 [user] 可以有许多 [invoices]。如果您熟悉关系数据库,则为一对多字段

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。

【问题讨论】:

标签: javascript mysql node.js database


【解决方案1】:

你可以在invoicesArray.find()上使用Array.map()来得到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);

【讨论】:

  • 这行得通,谢谢。这是最优化的方式吗,发票可以是非常巨大的 40k 对象。
【解决方案2】:

我建议您只遍历发票并使用具有唯一条目的集合中的条目来丰富条目。

类似这样的东西(没有测试代码,但希望你能理解这个想法)

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】:

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

    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】:

      你可以使用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】:

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

        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; }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-30
          • 2022-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-09
          相关资源
          最近更新 更多