2

我有一个函数,我已经修改它来获取一个字符串(仅由零和一组成)。字符串 ( timesheetcoldata):

100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000

每次运行函数时,字符串项(数字一和零)都会改变。它总是相同的长度。我已经使上面的字符串更容易看到我想要实现的目标。

我想返回第一个字符,然后返回每 24 个字符(如函数中的变量 colsCount 中)。因此,在上面的示例中,它将返回如下内容:111111

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

然后我想将这些数字相加(所以它会返回,在示例中:)6

然后我想检查返回的数字是否与变量匹配:rowsCount 或者true如果匹配,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);

});
4

3 回答 3

1

您始终可以依靠传统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)

于 2019-08-19T08:15:50.773 回答
0

这是一步一步的解释,关于做什么。

  • 用于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);

于 2019-08-19T07:56:38.320 回答
0

正如@Jaromanda 提到的,您可以使用以下方法来完成此操作。

const string = '100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000';

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

console.log(value);

于 2019-08-19T08:06:09.197 回答