获取map()ES6

时间:2018-07-04 19:56:08

标签: javascript arrays recursion ecmascript-6 sum

下面是更新的代码,该代码读取子文件中的所有内容,在单个数组中返回所有整数,并返回数组中所有项目的总和:

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]

哪种方法是获取这些数字总和的最佳方法?

2 个答案:

答案 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));