如何在for循环上使用reduce()方法?

时间:2016-09-05 18:18:21

标签: javascript arrays reduce

我正在尝试编写一个将Binary转换为字符串的代码,我逐步采取解决方案,我的第一步是添加charcodes然后使用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数组再次设置为undefined并重置,我也无法使用push而且我有这个错误,TypeError:无法读取属性&#39; push& #39;未定义的

在MDN上,有一个使用concat()方法的例子,所以我试图推Array.prototype.reduce()

2 个答案:

答案 0 :(得分:3)

我写这样的函数:

function binaryAgent(encoded) {
  return encoded.split(' ').map(function(bytestr) {
    return String.fromCharCode(parseInt(bytestr, 2));
  }).join('');
}

将二进制表示转换为数字是一项旧任务,而且它已经为您解决了。即使您想为学习目的编写自己的实现,最好对其进行抽象(以便您可以替换parseInt(bytestr, 2)行 - 但保留其余代码完整。

一种可能的减少使用方法(不是最有效的方法,请注意,但使用非常常见的技术):

function parseBinary(str) {
  return str.split('').reduce(function(acc, el) {
    return acc * 2 + +el;
  }, 0);
}

也就是说,你没有任何预先填充的&#39;权力阵列2;相反,您的累加器在每个减速器步骤乘以2,添加当前数字。当+运算符重载时,您应该将数字操作数转换为数字(最简单的方法是应用一元加号 - +)。

回答评论中给出的问题:您可以通过调用toString()来轻松地将任意数字转换为二进制,八进制或十六进制格式,并将传递的参数视为基数。但这是它的功能:

function toBinary(num, reslen) {
  var res = '';
  while (num || res.length < reslen) {
    res = (num & 1) + res;
    num >>= 1;
  }
  return res;
}

答案 1 :(得分:0)

首先 - 在你的reduce函数中 - 如果item不等于1 - 在下一次迭代中toArray将是未定义的。

你需要总是在reduce函数中返回一个值,以便定义第一个参数(累加器)

应该是那样的 -

if (item == 1) {
    toArray.push(op);
}
return toArray;  

除了我理解你的代码之外 - rightPattern var应该在reduce函数之外,但在for循环中。