2016-08-30 1 views
0

Хорошо, поэтому я сидел один день, думая о том, «Что делать, если я делаю свою собственную кодировку как Base64 в JavaScript?» и затем я придумал идею создания библиотеки, которая позволяет вам создавать свою собственную кодировку, такую ​​как Base64. Это код, который я придумал:Поиск ключей, равных значениям, которые не работают

var Zinc = Zinc || {}; 
Zinc.Encoding = function(name) { 
    this.encodingName = name; 
    this.conversionTable = {}; 
    this.addToTable = function(string, convertsTo) { 
     this.conversionTable[string] = convertsTo; 
    }; 
    this.removeFromTable = function(string) { 
     delete this.conversionTable[string]; 
    }; 
    this.encode = function(string) { 
     var len = string.length; 
     var out = string.split(""); 
     for (var i = 0; i < out.length; i++) { 
      out[i] = this.conversionTable[out[i]]; 
     } 
     return out.join(""); 
    } 
    this.decode = function(string) { 
     var len = string.length; 
     var dec = string.split(""); 
     var out = []; 

     for (var i = 0; i < dec.length; i++) { 
      out[i] = this.getTableKeyByValue(dec[i]); 
     } 

     return out.join(""); 
    } 
    /* Used internally. */ 
    this.getTableKeyByValue = function(value) { 
     for (var prop in this.conversionTable) { 
      if (this.conversionTable.hasOwnProperty(prop)) { 
       if (this[prop] === value) 
        return prop; 
      } 
     } 
    }; 
} 

window.Zinc = Zinc; 

кодирования работ и все, просто попробуйте это:

var test = new Zinc.Encoding(); test.addToTable("j", "blah"); test.encode("j");

И это выводит: "blah".

Попробуйте сделать: test.decode("blah"), но он ничего не делает и возвращает "". Почему это делается вместо того, чтобы найти ключ в объекте таблицы и получить имя, равное значению, и превратить значение в имя, равное значению. (? Запутанные, справа)

+0

Пожалуйста, сделайте [mcve] – zer00ne

+1

У вас нет правильных разделителей, вы говорите, что 'j' равно' blah', а затем, когда вы кормите 'blah', вы просто разделите эту строку на' b', 'l',' a', 'h' и т. д., и ваша таблица преобразования не имеет ни одного из этих значений, она имеет только значение' blah', и если бы у вас было более одного значения, у вас не было бы способ узнать, где его разделить, поэтому вся концепция ошибочна. И ... это должно быть 'if (this.conversionTable [prop] === value) ...'. Почему бы просто не использовать обычный объект или B64 вместо – adeneo

+0

Ваш метод кодирования не является обратимым. Предположим, что у вас есть 'a => p',' b => qr' и 'c => pqr'. Если вы хотите декодировать 'pqr', нет никакого способа узнать, было ли это изначально' ab' или 'c'. – Barmar

ответ

1

Decode вспыхивает каждый символ строки, переданную в Может быть, вы имеете в виду, чтобы разделить на словоразделах вместо:.

var conversionTable = { 
 
    'j': 'blah' 
 
}; 
 

 
function decode(string) { 
 
    var len = string.length; 
 
    var dec = string.split(/\b/); 
 
    var out = []; 
 

 
    for (var i = 0; i < dec.length; i++) { 
 
    out[i] = this.getTableKeyByValue(dec[i]); 
 
    } 
 

 
    return out.join(" "); 
 
}; 
 

 
function getTableKeyByValue(value) { 
 
    for (var prop in conversionTable) { 
 
    if (conversionTable.hasOwnProperty(prop)) { 
 
     if (conversionTable[prop] === value) 
 
     return prop; 
 
    } 
 
    } 
 
}; 
 
console.log(decode('blah')); 
 
console.log(decode('blah blah'));

+0

hmm ... ill посмотреть об этом коде –

Смежные вопросы