Javascript 无法解决此字符串压缩问题

Javascript 无法解决此字符串压缩问题,javascript,compression,Javascript,Compression,我有一种情况,我需要以这种方式压缩字符串: "AAABBBCCCDDD" => "A3B3C3D3", or "ABBCCCDDDDEEEEE" => "A1B2C3D4E5", or "FOOFOO" => "F1O2F1O2", this one is the one I can't solve 我正在用JavaScript实现这一点,到目前为止,我已经提出了以下建议: function in_array(key, array) { for(var x in ar

我有一种情况,我需要以这种方式压缩字符串:

"AAABBBCCCDDD" => "A3B3C3D3", or
"ABBCCCDDDDEEEEE" => "A1B2C3D4E5", or
"FOOFOO" => "F1O2F1O2", this one is the one I can't solve
我正在用JavaScript实现这一点,到目前为止,我已经提出了以下建议:

function in_array(key, array) {
    for(var x in array) {
        if(array[x] == key) {
            return true;
        }
    }

    return false;
}

function compress(str) {
    var str_splitted = str.split('');
    var new_strings = [];

    for(var x in str_splitted) {
        if(!in_array(str_splitted[x], new_strings)) {
            new_strings.push( str_splitted[x] );
            new_strings.push( (str.split(str_splitted[x]).length - 1) );
        }
    }

    return new_strings.join('');
}
因此,在我的代码片段中,两个示例将完美地工作,但第三个示例将不计算所有匹配的字符,因此输出为:

"FOOFOO" => "F2O3", and not "F1O2F1O2"

对于这个问题,我真的需要帮助、提示、建议和/或更好的解决方案,我感谢所有帮助我解决这个问题的人

循环字符串并与上一个字符进行比较:

function compress(str) {
    var last = null, cnt = 0, result = '';
    for (var i = 0; i < str.length; i++) {
        var c = str.charAt(i);
        if (last != c) {
            if (last != null) {
                result += last + cnt;
            }
            last = c;
            cnt = 0;
        }
        cnt++;
    }
    if (cnt > 0) {
        result += last + cnt;
    }
    return result;
}
函数压缩(str){
var last=null,cnt=0,result='';
对于(变量i=0;i0){
结果+=最后一次+cnt;
}
返回结果;
}
演示:


注意:使用括号按索引访问字符串在旧版本的IE中不起作用,因此请使用
charAt

循环字符串并与前面的字符进行比较:

function compress(str) {
    var last = null, cnt = 0, result = '';
    for (var i = 0; i < str.length; i++) {
        var c = str.charAt(i);
        if (last != c) {
            if (last != null) {
                result += last + cnt;
            }
            last = c;
            cnt = 0;
        }
        cnt++;
    }
    if (cnt > 0) {
        result += last + cnt;
    }
    return result;
}
function compress(str) {
    var result = '',
        last = null,
        count = 0;
    for (var i = 0; i < str.length; i++) {
        var cur = str.substr(i, 1);
        if (cur !== last || count == 9) {
            if (last !== null) {
                result += last + count;
            }
            last = cur;
            count = 0;
        }
        count++;
    }
    // Append the last character
    if (last !== null) {
        result += last + count;
    }
    return result;
}
函数压缩(str){
var last=null,cnt=0,result='';
对于(变量i=0;i0){
结果+=最后一次+cnt;
}
返回结果;
}
演示:

注意:使用括号按索引访问字符串在旧版本的IE中不起作用,因此请使用
charAt

函数压缩(str){
function compress(str) {
    var result = '',
        last = null,
        count = 0;
    for (var i = 0; i < str.length; i++) {
        var cur = str.substr(i, 1);
        if (cur !== last || count == 9) {
            if (last !== null) {
                result += last + count;
            }
            last = cur;
            count = 0;
        }
        count++;
    }
    // Append the last character
    if (last !== null) {
        result += last + count;
    }
    return result;
}
var结果=“”, last=null, 计数=0; 对于(变量i=0;i
函数压缩(str){
var结果=“”,
last=null,
计数=0;
对于(变量i=0;i
函数压缩(str){
var结果=“”,
当前=“”,
计数=0;
对于(var i=0;i
函数压缩(str){
var结果=“”,
当前=“”,
计数=0;

对于(var i=0;我想你只是计算每个字母的总出现次数,而不是检查它们是否在一行。@Barmar-是的,我的朋友,我知道……我找不到实现这一点的逻辑。你能帮我吗?你只是计算每个字母的总出现次数,而不是检查它们是否在一行。@Barmar-是的,我的朋友,我知道……我知道找不到实现这一点的逻辑。你能帮我吗?压缩(“FOOFOO”)==>“F0O0F0O0”。你忘了增加计数器。我在第一次试运行时遇到了相同的错误。:)谢谢。修复了这个问题,还添加了一个计数达到9的检查。这个压缩语法不能处理2位数的长度。好吧……如果它不支持用数字压缩字符串,那就没问题了。@Guffa True,但这似乎是一个奇怪的限制。而且RLE字符串并不奇怪…;)compress(“FOOFOO”)==>“f0f0f0o0”.您忘了增加计数器。我在第一次试运行时遇到了相同的错误。:)谢谢。修复了这个问题,还添加了计数达到9的检查。这个压缩语法不能处理2位数的长度。嗯……如果它不支持用数字压缩字符串,那就没问题了。@Guffa True,但这似乎是一个奇怪的限制。而且RLE字符串并不奇怪……;)