javascript - 与 LINQ 的 SelectMany 运算符等效的 underscore.js 是什么?

标签 javascript underscore.js linq

假设我有一个嵌套数组结构。

var nested = [ [1], [2], [3] ];

使用 underscore.js ,我将如何生成扁平化数组?

在 C# 中,您将使用 Enumerable.SelectMany像这样:

var flattened = nested.SelectMany(item => item);

请注意,本例中的 lambda 直接选择嵌套项,但它可以是任意表达式。

在 jQuery 中,可以只使用:

var flattened = $.map(nested, function(item) { return item; });

但是这种方法不适用于下划线的 map功能。

那么我如何使用 underscore.js 获得扁平数组 [1, 2, 3]

最佳答案

如果你有一个稍微复杂的数组,比如来自 JSON 的数组,你可以利用 pluck方法,提取您感兴趣的特定属性,类似于 parents.SelectMany(parent => parent.Items);

// underscore version
var allitems = _.flatten(_.pluck(parents, 'items'));

allitems 现在是父级 [a,b,c,d] 中所有子项的数组。

还有一个 JSFiddle显示相同的内容。


或者,如果您使用的是 lodash,您可以使用 _.flatMap 来做同样的事情。从版本 4 开始可用的功能。感谢 Noel 在评论中指出它。

var parents = [
  { name: 'hello', items: ['a', 'b'] },
  { name: 'world', items: ['c', 'd'] }
];


// version 1 of lodash, straight up
var allitems = _.flatMap(parents, 'items');
logIt('straight', allitems);

// or by wrapping the collection first
var allitems = _(parents)
  .flatMap('items')
  .value();
logIt('wrapped', allitems);

// this basically does _(parents).map('items').flatten().value();

function logIt(wat, value) {
  console.log(wat, value)
}
<script src="https://cdn.jsdelivr.net/lodash/4.16.6/lodash.min.js"></script>
<pre id="result"></pre>


如果你想做更多的事情而不想链接操作符,你可以使用 flow函数以获得相同的效果。如果您使用 TypeScript 并单独导入每个运算符,这将非常有用,因为您可以随后优化最终有效负载。

const parents = [
  { name: 'hello', items: ['a', 'b'] },
  { name: 'world', items: ['c', 'd'] }
];
logIt('original', parents);

const result = _.flow(
  (collection) => _.flatMap(collection, (item) => item.items),
  (flattened) => flattened.filter((item) => item !== 'd')
)(parents);
logIt('result without "d"', result);

function logIt(wat, value) {
  console.log(wat, value);
}
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
<pre id="result"></pre>

关于javascript - 与 LINQ 的 SelectMany 运算符等效的 underscore.js 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12344007/

相关文章:

javascript - 受javascript影响后如何恢复到原来的DOM

c# - 使用 LINQ 查找某个函数上的哪个元素 "scores highest"

Node.js 和 underscore.js -- 模板化

c# - 如何在 C# 中的泛型列表中搜索特定值?

c# - AcceptAllChanges 导致 Entity Framework ... 不接受更改?

javascript - 使用 addEventListener/attachEvent 注册框架的 onload 事件

javascript - 如何将变量从一个页面传递到另一个未链接的页面

javascript - Chart.js 插件注释线阴影

javascript - 如何修改数组?

javascript - 如何保持对象的属性与java脚本中给定对象的顺序相同?