下面是更新的代码,该代码读取子文件中的所有内容,在单个数组中返回所有整数,并返回数组中所有项目的总和:
const fs = require('fs')
let output = (file) => {
let data = fs.readFileSync(file, 'utf8')
.split('\n')
.reduce((array, i) => {
if (i.match(/.txt$/)) {
let intArr = array.concat(output(i))
return intArr
} else if (i.match(/^\d+$/)) {
array.push(parseInt(i, 10));
}
return array;
}, [])
return data
}
console.log(output('a.txt')) // single array
const sum = output('a.txt')
console.log(sum.reduce((a, b) => a + b, 0)) // sum of array contents
我试图将以下代码的结果放入单个数组中,以便获得所有数字的总和。考虑文件a.txt
的内容是
1
b.txt
b.txt
的内容是
2
c.txt
和c.txt
的内容是
3
代码如下:
const fs = require('fs')
let output = (file) => {
let data = fs.readFileSync(file, 'utf8')
.split('\n')
.map((i) => {
return i
})
let subData = data
.filter(value => /.txt$/.test(value))
.map((i) => {
output(i)
return i
})
let intData = data
.filter(value => /^\d+$/.test(value))
.map((i) => {
return parseInt(i, 10)
})
console.log(intData)
}
output('a.txt')
这将输出:
[3]
[2]
[1]
哪种方法是获取这些数字总和的最佳方法?
答案 0 :(得分:0)
您可以使用.reduce
方法而不是.map
来修改代码:
reduce()
方法对累加器和数组中的每个元素(从左到右)应用一个函数,以将其减小为单个值。
const fs = require('fs')
let output = (file) => {
let data = fs.readFileSync(file, 'utf8')
.split('\n')
.reduce((sum, i) => {
if (i.match(/.txt$/)) {
sum += output(i);
} else if (i.match(/^\d+$/)) {
sum += parseInt(i, 10);
}
return sum;
}, 0)
}
如果要将整数保存在数组中,则可以将其简化为数组:
const fs = require('fs')
let output = (file) => {
let data = fs.readFileSync(file, 'utf8')
.split('\n')
.reduce((array, i) => {
if (i.match(/.txt$/)) {
array.concat(output(i));
} else if (i.match(/^\d+$/)) {
array.push(parseInt(i, 10));
}
return array;
}, [])
}
然后,如果要获取文件a.txt
的总和,请执行以下操作:
const sum = output('a.txt').map((sum,i) => sum + i);
答案 1 :(得分:0)
下面使用了readFile的承诺版本,我故意将其详细说明一下,以说明正在发生的事情,您可以明显地简化/缩短一点。
但是,它需要一个文件数组,过滤出每个数字并将它们相加
const fs = require('fs');
const {promisify} = require('util');
const readFileAsync = promisify(fs.readFile);
function readAndSum(file) {
return readFileAsync(file, 'utf8')
.then(f => f.split('\n'))
.then(lines => {
return lines.map(line => {
let newFile = line.match(/\w+\.txt/);
if (newFile) {
return readAndSum(newFile[0]);
}
return Number(line);
})
})
.then(t => Promise.all(t.reduce((a, b) => a.concat(b), [])))
.then(numbers => numbers.reduce((a, b) => a + b, 0))
}
readAndSum('foo.txt').then(sum => console.log(sum));