Получить сумму результата карты () ES6 - PullRequest
0 голосов
/ 04 июля 2018

Вот обновленный код, который считывает все содержимое в подфайлах, возвращает все целые числа в одном массиве и возвращает сумму всех элементов в массиве:

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 голосов
/ 05 июля 2018

Ниже используется многообещающая версия 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));
0 голосов
/ 04 июля 2018

Вы можете изменить свой код, используя метод .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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...