javascript - 如何在不同的行字符串中添加值?
问题描述
我有一些包含多行的数据,如下所示。我需要将每个字符串中的值相加。
原始字符串:
/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
我需要的价值计算:
- 我应该能够读取每一行并最终将“10M”放置值相加
- 我应该可以跳过任何以 'nfs','udev' 开头的行
- 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
解决方案
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);
推荐阅读
- docker - 在 docker-compose 中更改 Swagger 端口
- git - Ansible Git 克隆逃逸特殊字符
- javascript - jquery函数只在页面刷新后加载
- google-cloud-storage - 在计划的 Dataprep 作业中,是否可以使用基于后缀的名称在数据存储中导出输出 csv?
- node.js - 如何为 GraphQL 使用数组模式类型
- java - Java 8 如何确保我们的代码检查完整的证书链?
- tsql - SQL NOT LIKE 与动态列表的比较
- ruby-on-rails - 我收到此错误:为数据库适配器指定了“sqlite3”,但未加载 gem
- javascript - 如何删除 2 个数组上的相同值?
- javascript - If, Else if, Else - 不输出“else”代码