如何在 for 循环中使用 reduce() 方法?
How to use reduce() method on for loops?
我正在尝试编写一个将二进制转换为字符串的代码,我一步一步地采取解决方案,我的第一步是添加字符代码然后使用 fromCharcode,我不知道这是否可能但这是我的代码:
function binaryAgent(str) {
var x = str.split(' ').map(function (item) { // split with space
return item.split(''); //split every character
});
var fg = [];
for(var i=0; i<x.length; i++) {
var f = x[i].reduce(function (toArray,item){
debugger;
var rightPattern = [128,64,32,16,8,4,2,1]; // i want to create this array on every iteration
var op = rightPattern.shift(); // on every iteration, shift a value from rightPattern, this is for binary pattern
if(item=='1'){ // if item is 1,i think it doesn't matter if it's string or num, I care for 0 and 1 only, push the variable op, shifted from array
return toArray.push(op); // push it on the initial value,
}
}, []); // []<-- initial array.
return x;
}
}
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");
我用调试器检查了这个,我观察到:在每次迭代中,我的 rightPattern 数组再次设置为未定义并重置,我也不能使用 push 并且我有这个错误,TypeError: Cannot read 属性 'push' 未定义
在 MDN 上,有一个使用 concat() 方法的示例,所以我尝试推送 Array.prototype.reduce()
我会这样写你的函数:
function binaryAgent(encoded) {
return encoded.split(' ').map(function(bytestr) {
return String.fromCharCode(parseInt(bytestr, 2));
}).join('');
}
将二进制表示形式转换为数字是一项古老的任务,它已经为您解决了。即使您想编写自己的实现用于学习目的,最好将其抽象化(以便您可以替换 parseInt(bytestr, 2)
行 - 但保留其余代码不变。
一种可能的 reduce-using 方法(请注意,这不是最高效的方法,但采用了一种非常常见的技术):
function parseBinary(str) {
return str.split('').reduce(function(acc, el) {
return acc * 2 + +el;
}, 0);
}
也就是说,您没有任何 'pre-filled' 个 2 的幂数组;相反,您的累加器在每个减速器步骤中乘以 2,加上当前数字。由于 +
运算符被重载,您应该将数字操作数转换为数字(最简单的方法是应用一元加 - +
)。
回答评论中给出的问题:您可以通过调用 toString()
将任何数字轻松转换为二进制、八进制或十六进制格式,并将传递的参数视为基数。但这里有一个函数:
function toBinary(num, reslen) {
var res = '';
while (num || res.length < reslen) {
res = (num & 1) + res;
num >>= 1;
}
return res;
}
首先 - 在你的 reduce 函数中 - 如果 item 不等于 1 - 在下一次迭代中 toArray 将是未定义的。
您需要始终 return reduce 函数中的一个值,以便定义第一个参数(累加器)
应该是这样的 -
if (item == 1) {
toArray.push(op);
}
return toArray;
除此之外,据我了解您的代码 - rightPattern var 应该在 reduce 函数之外但在 for 循环内。
我正在尝试编写一个将二进制转换为字符串的代码,我一步一步地采取解决方案,我的第一步是添加字符代码然后使用 fromCharcode,我不知道这是否可能但这是我的代码:
function binaryAgent(str) {
var x = str.split(' ').map(function (item) { // split with space
return item.split(''); //split every character
});
var fg = [];
for(var i=0; i<x.length; i++) {
var f = x[i].reduce(function (toArray,item){
debugger;
var rightPattern = [128,64,32,16,8,4,2,1]; // i want to create this array on every iteration
var op = rightPattern.shift(); // on every iteration, shift a value from rightPattern, this is for binary pattern
if(item=='1'){ // if item is 1,i think it doesn't matter if it's string or num, I care for 0 and 1 only, push the variable op, shifted from array
return toArray.push(op); // push it on the initial value,
}
}, []); // []<-- initial array.
return x;
}
}
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");
我用调试器检查了这个,我观察到:在每次迭代中,我的 rightPattern 数组再次设置为未定义并重置,我也不能使用 push 并且我有这个错误,TypeError: Cannot read 属性 'push' 未定义
在 MDN 上,有一个使用 concat() 方法的示例,所以我尝试推送 Array.prototype.reduce()
我会这样写你的函数:
function binaryAgent(encoded) {
return encoded.split(' ').map(function(bytestr) {
return String.fromCharCode(parseInt(bytestr, 2));
}).join('');
}
将二进制表示形式转换为数字是一项古老的任务,它已经为您解决了。即使您想编写自己的实现用于学习目的,最好将其抽象化(以便您可以替换 parseInt(bytestr, 2)
行 - 但保留其余代码不变。
一种可能的 reduce-using 方法(请注意,这不是最高效的方法,但采用了一种非常常见的技术):
function parseBinary(str) {
return str.split('').reduce(function(acc, el) {
return acc * 2 + +el;
}, 0);
}
也就是说,您没有任何 'pre-filled' 个 2 的幂数组;相反,您的累加器在每个减速器步骤中乘以 2,加上当前数字。由于 +
运算符被重载,您应该将数字操作数转换为数字(最简单的方法是应用一元加 - +
)。
回答评论中给出的问题:您可以通过调用 toString()
将任何数字轻松转换为二进制、八进制或十六进制格式,并将传递的参数视为基数。但这里有一个函数:
function toBinary(num, reslen) {
var res = '';
while (num || res.length < reslen) {
res = (num & 1) + res;
num >>= 1;
}
return res;
}
首先 - 在你的 reduce 函数中 - 如果 item 不等于 1 - 在下一次迭代中 toArray 将是未定义的。
您需要始终 return reduce 函数中的一个值,以便定义第一个参数(累加器)
应该是这样的 -
if (item == 1) {
toArray.push(op);
}
return toArray;
除此之外,据我了解您的代码 - rightPattern var 应该在 reduce 函数之外但在 for 循环内。