Как использовать метод limit () для циклов?

Я пытаюсь написать код, который преобразует двоичный файл в строку, я принимаю решения шаг за шагом, мой первый шаг - добавить коды, затем использовать 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: Невозможно прочитать свойство 'push' из undefined

в MDN есть пример использования метода concat(), поэтому я попытался выдвинуть Array.prototype.reduce()

2 ответа

Решение

Я бы написал вашу функцию так:

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);
}

То есть у вас нет "предварительно заполненных" массивов степеней 2; вместо этого ваш аккумулятор умножается на 2 на каждом шаге редуктора, добавляя текущую цифру. Как + оператор перегружен, вы должны преобразовать числовой операнд в число (самый простой способ - применить унарный плюс - +).


Отвечая на вопрос, заданный в комментариях: вы можете легко преобразовать любое число в двоичный, восьмеричный или шестнадцатеричный формат, позвонив toString() на нем, с переданным аргументом, рассматриваемым как основание. Но вот функция для этого:

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

Прежде всего - в вашей функции приведения - если элемент не будет равен единице - на следующей итерации toArray будет неопределенным.

вам всегда нужно возвращать значение в функции Reduce, чтобы определить первый аргумент (аккумулятор)

должно быть что-то подобное -

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

кроме этого, как я понимаю ваш код - var rightPattern должен быть вне функции Reduce, но внутри цикла for.

Другие вопросы по тегам