如果我有类似
的话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']
有没有简单,简短的方法来实现下划线或破折号?没有迭代结果,做一个字符串拆分并将其放入一个新数组?
答案 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
会破坏任何深层结构。)