如何拆分字符串,转换为数字和求和
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 数字是否与变量匹配: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);
});
这里有一步一步的解释,关于该怎么做。
- 使用
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
进行此类操作。使用函数式操作可以提高可读性,但会更耗时(虽然不多)。
您可以试试这个简单的算法:
- 创建一个包含所有数字的列表和一个
count
变量来保存总和。
- 循环字符串。由于字符串是固定的,您可以将增量因子设置为count(
24
).
- 转换给定索引处的字符并将其保存在变量中。
- 将此变量推入列表并计算每个间隔的总和。
在此循环结束时,您将获得两个值。
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)
我修改了一个函数以获取字符串(仅由零和一组成)。
字符串 (timesheetcoldata
):
100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000100000000000000000000000
每次函数 运行 时,字符串项(数字 1 和 0)都会发生变化。 它将始终是相同的长度。 我已经使上面的字符串更容易看到我想要实现的目标。
我想 return 第一个字符,然后每隔 24 个字符(如函数中的变量 colsCount 所示)。
因此,在上面的示例中,它会 return 类似于:111111
然后我想将这些字符转换为数字(类似于 [1, 1, 1, 1, 1, 1]
)。
然后我想将这些数字加在一起(所以它会 return,在示例中:6
)。
然后我想检查 returned 数字是否与变量匹配: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);
});
这里有一步一步的解释,关于该怎么做。
- 使用
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
进行此类操作。使用函数式操作可以提高可读性,但会更耗时(虽然不多)。
您可以试试这个简单的算法:
- 创建一个包含所有数字的列表和一个
count
变量来保存总和。 - 循环字符串。由于字符串是固定的,您可以将增量因子设置为count(
24
). - 转换给定索引处的字符并将其保存在变量中。
- 将此变量推入列表并计算每个间隔的总和。
在此循环结束时,您将获得两个值。
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)