首页 > 解决方案 > 如何在不同的行字符串中添加值?

问题描述

我有一些包含多行的数据,如下所示。我需要将每个字符串中的值相加。

原始字符串:

/dev/mapper/mpathap1  10M  141M  311M  32% /boot
udev/mapper/sysvg-optlv 976M  2.3M  923M   1% /home
/dev/mapper/sysvg-homelv
                      10M  2.3M  923M   1% /home
nfs/mapper/sysvg-optlv
                      10M  2.3M  923M   1% /home
udev/mapper/sysvg-optlv
                      976M  2.3M  923M   1% /home
/dev/mapper/mpathap1  10M  141M  311M  32% /boot

我需要的价值计算:

  1. 我应该能够读取每一行并最终将“10M”放置值相加
  2. 我应该可以跳过任何以 'nfs','udev' 开头的行
  3. 3-4、5-6、7-8 行应该在同一行,但由于字符串长度,4、6、8 行转到新行。

我尝试了下面的代码,但我只能捕获单行前第一行和最后一行中的值,因为所有内容都在同一行中。

let lines = '/dev/mapper/mpathap1  10M  141M  311M  32% /boot
udev/mapper/sysvg-optlv 976M  2.3M  923M   1% /home
/dev/mapper/sysvg-homelv
                      10M  2.3M  923M   1% /home
nfs/mapper/sysvg-optlv
                      10M  2.3M  923M   1% /home
udev/mapper/sysvg-optlv
                      976M  2.3M  923M   1% /home
/dev/mapper/mpathap1  10M  141M  311M  32% /boot
let gb = 0;
let mb = 0;
for (var i = 0; i < lines.length; i++) {
        var disk = lines[i];
    if (!disk.startsWith('udev') && !disk.startsWith('nfs')){
            var diskSpace = disk.split(/\s+/).slice(1,2).toString();

            if(diskSpace.indexOf('G')> -1){
                gb = gb + parseInt(diskSpace);

            }if(diskSpace.indexOf('M')> -1){
                mb = mb + parseInt(diskSpace) / 1024;

            }
        }
    }
    console.log(gb  + mb);

答案是:30

标签: javascript

解决方案


filter我将使用数组方法( , map, )链接该过程的每个步骤reduce,因此您将获得一种功能方法:

let lines = `/dev/mapper/mpathap1  10M  141M  311M  32% /boot
udev/mapper/sysvg-optlv 976M  2.3M  923M   1% /home
/dev/mapper/sysvg-homelv
                      10M  2.3M  923M   1% /home
nfs/mapper/sysvg-optlv
                      10M  2.3M  923M   1% /home
udev/mapper/sysvg-optlv
                      976M  2.3M  923M   1% /home
/dev/mapper/mpathap1  10M  141M  311M  32% /boot`;

let sum = 
    // split into lines, keeping broken parts together
    lines.split(/\n(?=\S)/)
    // exclude lines with certain prefixes
    .filter(line => !line.startsWith("nfs/") && !line.startsWith("udev/"))
    // extract the numbers and their unit of measure
    .map(line => line.match(/\s\d+[MG]/))
    // convert to numbers in Megabytes
    .map(([str]) => parseInt(str) * (str.endsWith("G") ? 1024 : 1))
    // sum up
    .reduce((a, b) => a+b, 0);
    
console.log(sum);

如果您没有 ES6 对箭头语法的支持,那么您可以回退到旧语法:

var lines = "/dev/mapper/mpathap1  10M  141M  311M  32% /boot\n" +
    "udev/mapper/sysvg-optlv 976M  2.3M  923M   1% /home\n" +
    "/dev/mapper/sysvg-homelv\n" + 
    "                      10M  2.3M  923M   1% /home\n" + 
    "nfs/mapper/sysvg-optlv\n" + 
    "                      10M  2.3M  923M   1% /home\n" + 
    "udev/mapper/sysvg-optlv\n" + 
    "                      976M  2.3M  923M   1% /home\n" + 
    "/dev/mapper/mpathap1  10M  141M  311M  32% /boot";

var sum = 
    // split into lines, keeping broken parts together
    lines.split(/\n(?=\S)/)
    // exclude lines with certain prefixes
    .filter(function (line) {
         return line.indexOf("nfs/") !== 0 && line.indexOf("udev/") !== 0;
    })
    // extract the numbers and their unit of measure
    .map(function (line) {
         return line.match(/\s\d+[MG]/);
    })
    // convert to numbers in Megabytes
    .map(function (arr) {
         return parseInt(arr[0]) * (arr[0].slice(-1) === "G" ? 1024 : 1);
    })
    // sum up
    .reduce(function (a, b) {
         return a+b;
    }, 0);
    
console.log(sum);


推荐阅读