使用underscoreand和lodash库通过ID从数组中获取项目

时间:2015-09-28 19:50:33

标签: javascript underscore.js lodash

我有这个数组:

var arrA = [
      {"id": 1, "name": "Manager", "assignable": true},
      {"id": 2, "name": "Developer", "assignable": true},
      {"id": 3, "name": "Reporter", "assignable": true}
      {"id": 4, "name": "Position", "assignable": true},
      {"id": 5, "name": "Mayor", "assignable": true},
      {"id": 6, "name": "Porter", "assignable": true}];

var arrB = [1,4,5];

我在项目中使用 underscore.js lodash.js

从arrA数组获取id等于arrB项目的所有项目的优雅方法是什么?

2 个答案:

答案 0 :(得分:5)

最高性能和优雅的方式是使用lodash链接到.indexBy() 项目ID,然后使用 {{获取相关项目3}}:



git add

var arrA = [
      {"id": 1, "name": "Manager", "assignable": true},
      {"id": 2, "name": "Developer", "assignable": true},
      {"id": 3, "name": "Reporter", "assignable": true},
      {"id": 4, "name": "Position", "assignable": true},
      {"id": 5, "name": "Mayor", "assignable": true},
      {"id": 6, "name": "Porter", "assignable": true}
];

var arrB = [1,4,5];

var returnedItems = _(arrA)
  .indexBy('id')
  .at(arrB)
  .value();

document.getElementById('results').innerText = JSON.stringify(returnedItems);




答案 1 :(得分:2)

这是一个lodash解决方案:

_.filter(arrA, _.flow(
    _.identity,
    _.property('id'),
    _.partial(_.includes, arrB)
));

filter()函数返回一个只包含我们关心的项目的新数组。我们使用flow()函数构建一个相应过滤项目的回调 - 这是一个细分:

  • identity()函数返回传递给它的第一个参数。有几个参数传递给filter()回调,我们只关心第一个。
  • property()函数构建一个返回给定属性的函数。在这种情况下,我们要比较id
  • 最后一步是检查arrB中是否存在给定的ID。为此,我们使用partial()创建一个新函数,如果项目存在,则使用includes()返回true。

此风格并非适合所有人,但 是紧凑的,而且 总重。