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

将值从一个数组分配到嵌套数组的最有效方法

  •  0
  • random_user_name  · 技术社区  · 6 年前

    给定集合( users 在下面的代码片段中)包含子集合和另一个集合( organizations )其中包含我需要合并到的子集合中的属性 用户 ,最有效的方法是什么?

    下面的代码可以工作,但是嵌套迭代对我来说从来没有那么好的感觉。此外,生产环境有成百上千个结果,因此至少要考虑性能。

    仅供参考,我正在利用 lodash 图书馆,我知道会从 不过,我希望有人能提供一种更有效的方法来解决这个问题。

    下面的代码查找组织的名称,然后将该名称添加到 用户 用于应用程序其他部分的数组。

    (数据结构来自API,不能更改。)

    // organizations are actually fetched from an API via Observable.  Can change at any time.
    const organizations = [{
        organization_id: 5,
        organization_name: 'Sample 1'
      },
      {
        organization_id: 6,
        organization_name: 'Sample 2'
      },
      {
        organization_id: 9,
        organization_name: 'Sample 3'
      },
      // etc...
    ];
    
    // users are actually fetched from an API via Observable.  Can change at any time.
    const users = [{
        user_name: 'User 1',
        organizations: [{
            organization_id: 9,
            organization_role: 'Limited'
          },
          {
            organization_id: 6,
            organization_role: 'Admin'
          }
        ]
      },
      {
        user_name: 'User 2',
        organizations: [{
            organization_id: 5,
            organization_role: 'Limited'
          },
          {
            organization_id: 6,
            organization_role: 'Limited'
          }
        ]
      },
      // etc...
    ];
    
    
    document.addEventListener('DOMContentLoaded', () => {
      _.forEach(users, (user) => {
        _.forEach(user.organizations, (organization) => {
          organization.organization_name = _.get(_.find(organizations, ['organization_id', organization.organization_id]), 'organization_name', '?');
        });
      });
      console.log(users);
    }, false);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
    1 回复  |  直到 6 年前
        1
  •  1
  •   Ori Drori    6 年前

    自从 _.find() 是O(n)操作(其中n是组织常数的长度),for each操作o(m*l)(m用户数,l每个用户的平均组织数),总操作为O(n*m*l)。您可以通过首先映射组织将其降低为O(n+m*l),这是O(n)操作(使用 _.keyBy() 例如)。

    // organizations are actually fetched from an API via Observable.  Can change at any time.
    const organizations = [{"organization_id":5,"organization_name":"Sample 1"},{"organization_id":6,"organization_name":"Sample 2"},{"organization_id":9,"organization_name":"Sample 3"}];
    
    // users are actually fetched from an API via Observable.  Can change at any time.
    const users = [{"user_name":"User 1","organizations":[{"organization_id":9,"organization_role":"Limited"},{"organization_id":6,"organization_role":"Admin"}]},{"user_name":"User 2","organizations":[{"organization_id":5,"organization_role":"Limited"},{"organization_id":6,"organization_role":"Limited"}]}];
    
    
    document.addEventListener('DOMContentLoaded', () => {
      const orgDict = _.keyBy(organizations, 'organization_id');
      _.forEach(users, (user) => {
        _.forEach(user.organizations, (organization) => {
          organization.organization_name = _.get(orgDict['organization_id'], 'organization_name', '?');
        });
      });
      console.log(users);
    }, false);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>