如何拆分字符串,转换为数字和求和

How to split String, convert to Numbers and Sum

我修改了一个函数以获取字符串(仅由零和一组成)。 字符串 (timesheetcoldata):

100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000

每次函数 运行 时,字符串项(数字 1 和 0)都会发生变化。 它将始终是相同的长度。 我已经使上面的字符串更容易看到我想要实现的目标。

我想 return 第一个字符,然后每隔 24 个字符(如函数中的变量 colsCount 所示)。 因此,在上面的示例中,它会 return 类似于:111111

然后我想将这些字符转换为数字(类似于 [1, 1, 1, 1, 1, 1])。

然后我想将这些数字加在一起(所以它会 return,在示例中:6)。

然后我想检查 returned 数字是否与变量匹配:rowsCounttrue 如果有,false 如果没有。

我的函数:

$("#J_timingSubmit").click(function(ev){

  var sheetStates = sheet.getSheetStates();
  var rowsCount = 6;
  var colsCount = 24;
  var timesheetrowsdata = "";
  var timesheetcoldata = "";

  for(var row= 0, rowStates=[]; row<rowsCount; ++row){
    rowStates = sheetStates[row];
    timesheetrowsdata += rowStates+(row==rowsCount-1?'':',');
  }

  timesheetcoldata = timesheetrowsdata.replace(/,/g, '');
  console.log(timesheetcoldata);
});

非常感谢 Rajesh 和 MauriceNino(以及所有其他贡献者)。

通过他们的代码,我能够得出以下工作函数:

$("#J_timingSubmit").click(function(ev){

  var sheetStates = sheet.getSheetStates();
  var rowsCount = 6;
  var timesheetrowsdata = "";
  var timesheetcoldata = "";

  for(var row= 0, rowStates=[]; row<rowsCount; ++row){
    rowStates = sheetStates[row];
    timesheetrowsdata += rowStates+(row==rowsCount-1?'':',');
  }

  timesheetcoldata = timesheetrowsdata.replace(/,/g, '');

var count = 0;
var list = [];
for(var i = 0; i< timesheetcoldata.length; i+=24) {
  const num1 = Number(timesheetcoldata.charAt(i));
  list.push(num1);
  count += num1;
}

let isSameAsRowsCount = count == rowsCount;
console.log('Is Same? ', isSameAsRowsCount);

});

这里有一步一步的解释,关于该怎么做。

  • 使用match()获取每第n个字符
  • 使用map()转换数组元素
  • 使用 reduce() 对数组元素求和

所有需要说的都包含在代码注释中:

const testData = '100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000';

// Step 1) Create array of numbers from string
const dataArr = testData.match(/.{1,24}/g) // Split on every 24th char
                      .map(s => Number(s[0])) // Only take the first char as a Number

console.log(dataArr);

// Step 2) Sum array Numbers
let dataSum = dataArr.reduce((a, b) => a + b); // Add up all numbers

console.log(dataSum);

// Step 3) Compare your variables
let rowsCount = 123; // Your Test variable
let isSameAsRowsCount = dataSum == rowsCount;

console.log('Is Same? ', isSameAsRowsCount);

如@Jaromanda 所述,您可以使用以下方法来完成此操作。

const string = '100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000';

const value = string.split('').filter((e,i)=> !(i%24)).reduce((acc,cur)=> acc+ (+cur), 0);

console.log(value);

您始终可以依靠传统的 for 进行此类操作。使用函数式操作可以提高可读性,但会更耗时(虽然不多)。

您可以试试这个简单的算法:

  1. 创建一个包含所有数字的列表和一个 count 变量来保存总和。
  2. 循环字符串。由于字符串是固定的,您可以将增量因子设置为count(24).
  3. 转换给定索引处的字符并将其保存在变量中。
  4. 将此变量推入列表并计算每个间隔的总和。

在此循环结束时,您将获得两个值。

var string = '100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000';
var count = 0;
var list = [];
for(var i = 0; i< string.length; i+=24) {
  const num1 = Number(string.charAt(i));
  list.push(num1);
  count += num1;
}

console.log(list, count)