Nehmen wir an, ich habe dieses Array

[1,2,3,4,5,6,7,9]

Was ich ausgeben möchte, ist eine Zeichenfolge mit:

"{1 to 7;9}" 

Ich habe diesen Code:

var _checkbox = [1,2,3,4,5,6,7,9];
for (i=0; i<_checkbox.length; i++) {
    //if ($($(_checkbox)[i]).is(":checked"))
       ignore_response_from.push(i+1)
}

Das einzige Problem, das ich habe, ist die Ausgabe der Zeichenfolge "{1 bis 7; 9}" . wie soll ich das machen

2
Peter Wateber 9 Okt. 2012 im 10:43

6 Antworten

Beste Antwort

Los geht's, ich habe auch einen grundlegenden Testfall beigefügt:

var tests = [
    [1,2,3,4,5,6,7,9],
    [1,2,3,4,5,6,7,12,13,14,15,16,20],
    [1,2,3,4,5,6,7,12,13,14,15,16,20,21,22,23],
    [1,2,3,4,5,6,7,120,13,14,15,16,2890,21,22,23],
    [1,2,3,4,8,9,10,11,12,14,16,18,20,21,22,23,30,31,34]
];

var processArray = function(arr, sep) {
    var l = arr.length, i, sl, res = [], succ = [];

    for (i = 0; i < l; i++) {
        var c = (i != 0 && (arr[i - 1] + 1 !== arr[i]));
        if ((i == l - 1) || c) {   
             if (!c) succ.push(arr[i]);

             if ((sl = succ.length) > 0) {
                 res.push(succ[0] + sep + succ[sl - 1]);
                 succ = [];
             } 

             if (arr[i + 1] - 1 === arr[i]) {
                 succ.push(arr[i])
             } else if (c) {
                 res.push(arr[i]);
             }
         } else {
             succ.push(arr[i]);                 
         }
    }

    return res;
}

// setup
for (var i = 0; i < tests.length; i++) {
    console.log('Test ' + i + ' : { ' + processArray(tests[i], ' to ').join('; ') + ' }');
}

Hier ist die Geige

2
epoch 9 Okt. 2012 im 12:12

Mit Array.filter können Sie ein Array erstellen und anschließend das Ergebnis in eine Zeichenfolge konvertieren:

function combineEqualPrecedence(arr) {
 var combined = arr.filter(
      function(a,i,x){
       var cando = a-(x[i+1]||0) !== prev;
       prev = a-(x[i+1]||0);
       return cando;
      }, prev = 0
     )
    ,str = [];
 for (var i=0;i<combined.length;i+=2){
  str.push(combined[i+1] ? combined[i] + ' to '+ combined[i+1] : combined[i])
 }
 return '{'+str.join('; ')+'}';
}
// usage
combineEqualPrecedence([1,2,3,4,5,6,7,9]); 
              //=> {1 to 7; 9}
combineEqualPrecedence([1,2,3,4,5,6,7,9,10,11,13,14,15,17]); 
              //=> {1 to 7; 9 to 11; 13 to 15; 17}
0
KooiInc 9 Okt. 2012 im 08:08

Dies sollte den Trick machen:

var _checkbox = [1,2,3,4,5,6,7,9],
    start=null, out= [];
for (i=0; i<_checkbox.length; i++) {
    if(start === null) {
        if(_checkbox.length < i+1 || _checkbox[i+1] !== _checkbox[i]+1){
            out.push(_checkbox[i]);
        } else {
            start=_checkbox[i];
        }
    } else {
        if(_checkbox.length < i+1 || _checkbox[i+1] !== _checkbox[i]+1){
            out.push(start + " to " + _checkbox[i]);
            start=null;            
        }
    }
}
console.log( '{' + out.join(';') + '}');

http://jsfiddle.net/Vandeplas/HzdsG/

UPDATE Verschob es in eine Funktion und verwendete dieselben Testdaten wie die Epoche zum Vergleichen

http://jsfiddle.net/Vandeplas/HzdsG/2/

2
VDP 9 Okt. 2012 im 11:39

Hier ist die erste Methode, die mir in den Sinn kam. Ja, es ist hässlich , aber es scheint zu funktionieren:

function renderArray(_checkbox) {
    var output = [],
        rangeStart = 0;

    function outputCurrent() {
        if (rangeStart < i - 1)
            output.push(_checkbox[rangeStart] + " to " + _checkbox[i - 1]);
        else
            output.push(_checkbox[i - 1]);
        rangeStart = i;
    }
    for (var i = 1; i < _checkbox.length; i++)
        if (_checkbox[i] != _checkbox[i - 1] + 1)
           outputCurrent();
    outputCurrent();

    return "{" + output.join("; ") + "}";
}

console.log(renderArray([1,3,4,5,7,9,10,11,14]));
// logs "{1; 3 to 5; 7; 9 to 11; 14}"

Demo: http://jsfiddle.net/Jq2sQ/2/

1
nnnnnn 9 Okt. 2012 im 07:12

Meinst du das:

var _checkbox = [1,2,3,4,5,6,7,9], ignore_response_from= "{";
for (i=0; i<_checkbox.length; i++) {
    //if ($($(_checkbox)[i]).is(":checked"))
       ignore_response_from += (i+1)+",";
}
ignore_response_from += "}";

Ignore_response_from ist "{1,2,3,4,5,6,7,8,}" im Zeichenfolgenformat.

0
Nikko Reyes 9 Okt. 2012 im 06:54

Versuche dies

"{" + _checkbox[0] + "to" + _checkbox.slice(_checkbox.length -2).join(';') +"}"
-1
YogeshWaran 9 Okt. 2012 im 07:08