在gulp中,我有多个文件可以解析为对象数组;然后我想将所有这些数组合并为一个,并根据组合数组输出单个文件。
file1 parsed into array1
file2 parsed into array2
file3 parsed into array3
combinedArray = array1 + array2 + array3
combinedArray used to generate outputFile
我不确定如何使用gulp将三个数组合并为一个数组 - 我想我想减少或折叠流元素。
鉴于这些功能,你会怎么写呢?
parseFile(file)
返回数据对象数组createFile(objects)
从数据对象数组中生成文件对象我确信这很简单,但我不会猜测正确的搜索条件来找到答案。对节点不太熟悉......
这个问题的一个人为例子就是有几个文件充满了名字;从每个文件中提取以“B”开头的名称;然后输出以“B”开头的以字母为单位,重复数据删除的名称列表。因此,它不仅仅是文件的连接,它将解析为数据结构并将数据结构合并为一个,然后根据组合输出文件。
答案 0 :(得分:1)
你必须进入一些有趣的插件...... 我在下面实现了您的“B-names”要求:
在第一步中,我将每个输入文件的内容转换为一个JSON字符串,其中所有“B”名称都作为键,“true”作为值(像Set一样工作,消除了重复)。
在第二步中,我将所有文件“缩减”为一个文件。 (这有点像函数式编程中的“减少”)。每个文件的内容从JSON转换回对象,并且所有键都合并到一个最终对象中(同样消除了文件之间的重复)。 “reduce”中的最后一步将它们从最终对象中拉出来,对它们进行排序,然后将它们全部放入一个名为“b_names”的文件中。
(此代码为Coffeescript)
gulp = require 'gulp'
transform = (require 'gulp-insert').transform
reduce_file = require 'gulp-reduce-file'
gulp.task 'parse_and_merge', ->
gulp.src 'names*', cwd:'./input'
.pipe transform (contents,file)->
b_names = {}
for b_name in contents.match /B\w+/igm
b_names[b_name] = true
return JSON.stringify b_names
.pipe gulp.dest 'output' # not required, but maybe informative
.pipe reduce_file 'b_names',
(file,memo)->
this_nameset = JSON.parse(file.contents)
for key,val of this_nameset
memo[key] = true
return memo
,(memo)->
b_names = Object.keys(memo)
b_names.sort()
return b_names.join('\n')
,{}
.pipe gulp.dest 'output'
names1:
John
Bob
Charles
names2:
Joe
Buster
Michael
names3:
Jacob
Barack
Keith
Bob
Bob
b_names:
Barack
Bob
Buster
答案 1 :(得分:0)
这是我到目前为止所提出的问题,但如果有人能提供更好的答案,我很高兴接受它。感谢Arnelle Balane指向事件流的指针。
es = require "event-stream"
reduce = require "stream-reduce"
asyncParseFile = (file, callback) ->
stuff = parseFile(file)
callback(null, stuff)
asyncCreateFile = (stuff, callback) ->
file = createFile(stuff)
callback(null, file)
gulp.src myfiles
.pipe(es.map(asyncParseFile))
.pipe(reduce(arrayConcat, []))
.pipe(es.map(asyncCreateFile))
.pipe(savefile())