使用Underscore或Lo-Dash以逗号分隔属性到实际属性

时间:2014-09-15 16:54:51

标签: javascript underscore.js lodash

如果我有类似

的话
var obj = [{keywords: "a, b, c"}, {keywords: "d, e, f"}]

并做

var result = _.pluck(obj, 'keywords')

我得到了

result == ['a, b, c', 'd, e, f']

我想要

result == ['a', 'b', 'c', 'd', 'e', 'f']

有没有简单,简短的方法来实现下划线或破折号?没有迭代结果,做一个字符串拆分并将其放入一个新数组?

3 个答案:

答案 0 :(得分:3)

怎么样

var result = _(obj).pluck('keywords').join().replace(/\s/g, '').split(',');

编辑:较短的版本,评论中讨论的后果:

var result = _(obj).pluck('keywords').join().split(/[\s,]+/);

答案 1 :(得分:2)

没有下划线:

[].concat.apply([], obj.map(function(o) { return o.keywords.split(/[,\s]+/); }))

这利用了这样一个事实:concat做了一种扁平化,因为它将参数列表中数组中的各个元素添加到结果中。

答案 2 :(得分:1)

"没有迭代结果,做一个字符串拆分并将其放入一个新数组"?

没有;任何解决方案最终会做一些版本的。但是,您可以非常简洁地表达迭代/分割/数组构造:

_.flatten(_.map(obj, function(o){ return o.keywords.split(/,\s*/) }))

或者如果您更喜欢方法链:

_.chain(_.map(obj, function(o){ return o.keywords.split(/,\s*/) })).flatten()

但在这种情况下,你可能更喜欢这个:

_(obj).map(function(o){ return o.keywords.split(/,\s*/) })).flatten()

(这是让我希望Underscore / LoDash有一个flatMap的案例之一;在常规flatten的结果上调用map会破坏任何深层结构。)