在匹配的对象属性上连接两个数组

时间:2018-01-20 23:05:07

标签: javascript lodash

我想加入两个数组

const users = [{ user_id: 100, name: 'Bob' }, { user_id: 101, name: 'Joe' }]

const departments [{ id: 900, manager: 100 }, { id: 901, manager: 101 }]

我想通过将departments属性与部门的name属性相匹配来创建包含用户user_id的新manager数组。

有没有一种简单的方法可以在lodash(或普通的Javascript)中实现这一点?

新数组看起来像这样

[{ id: 900, manager: 100, name: 'Bob' }, { id: 900, manager: 101, name: 'Joe' }];

感谢任何帮助!

2 个答案:

答案 0 :(得分:7)

您可以使用Map进行更快速的查找,然后进行映射:

const users = [{ user_id: 100, name: 'Bob' }, { user_id: 101, name: 'Joe' }],
    departments = [{ id: 900, manager: 100 }, { id: 901, manager: 101 }];

const names = new Map(users.map( user => [user.user_id, user.name] )),
    res = departments.map( dep => Object.assign({ name: names.get(dep.manager) }, dep) );

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

请注意,在每个步骤中使用数组搜索方法时,创建Map的额外步骤将导致 O(n)时间效率,而不是 O(n²)迭代。这与小型用户阵列无关,但在使用较大的阵列时也是如此。

答案 1 :(得分:3)

您可以使用mapfind

轻松地使用JavaScript

const users = [{ user_id: 100, name: 'Bob' }, { user_id: 101, name: 'Joe' }]
const departments = [{ id: 900, manager: 100 }, { id: 901, manager: 101 }]

const result = departments
  .map(d => ({
    ...d,
    name: users.find(u =>
      u.user_id === d.manager).name
  }));

console.log(result);