2016-06-30 8 views
1

So habe ich ein Array von Objekten. Wirklich die Objekte folgen der GeoJSON-Spezifikation, also denken Sie daran. Innerhalb der "Eigenschaften" -Objekte existiert eine Eigenschaft von "Name". Dieser Name wird A, B, C ... blah ... Z, AA, AB usw. für jedes unterschiedliche Merkmal sein. Siehe JSON Beispiel (ich habe ein paar andere Dinge Streifen aus, die auf diese Frage nicht wichtig waren, wie die Geometrie und was nicht ...):Javascript - Holen Sie den nächsten Buchstaben aus einem Array von Objekten

{ 
    "features" : [{ 
      "properties" : { 
       "name" : "A", 
       "description" : null, 
      }, 
      "type" : "Feature" 
     }, { 
      "properties" : { 
       "name" : "B", 
       "description" : null, 
      }, 
      "type" : "Feature" 
     }, { 
      "properties" : { 
       "name" : "C", 
       "description" : null, 
      }, 
      "type" : "Feature" 
     } 
    ], 
    "type" : "FeatureCollection" 
} 

Was Ich mag würde tun, finden die MAX Buchstabe innerhalb dieser Reihe von Funktionen, um den nächsten in der Reihe zurückzugeben. In diesem Beispiel würde "C" als MAX betrachtet werden, daher müsste ich den Wert von "D" zurückgeben. Wenn ich AA hätte, würde das als MAX betrachtet werden, und es würde "AB" zurückgeben. Wenn der Maximalwert zufällig ein 'Z' ist, möchte ich einen Wert von 'AA' zurückgeben.
Kann die Verwendung von Kleinbuchstaben ignorieren und nur 26 englische Großbuchstaben verwenden. Keine anderen Charaktere.

Ich glaube, ich könnte dies mit etwas Verwendung des Javascript CharCodeAt (Index) sowie die Anwendung von Math.max, Hinzufügen + 1, dann die Konvertierung zurück zu ihr Ascii Character Representation ... aber ich habe Probleme zu bringen Dies zusammen in einer funktionierenden Funktion, die all diese Dinge durchläuft.

Hilfe wäre willkommen!

Update: Ich habe es teilweise mit dem folgenden Code arbeiten. Allerdings habe ich nicht recht herausgefunden, wie man es zum Laufen bringt, wenn es von Z nach AA umschlingt. Oder wenn der MAX AF ist, dann wird AG zurückgegeben. AZ müsste BA zurückgeben.

String.fromCharCode(Math.max.apply(Math,someObject.features.map(function(o){return o.properties.name.charCodeAt(0);})) + 1) 

Andere bekannte Regeln:

  • Obergrenze kann ZZ sein - sehr unwahrscheinlich, dass ich brauchen würde, um AAA zu wickeln zurück
  • Die max Charakter wird nicht immer in dem Array letzte Mal gewesen sein, so kann nicht einfach die letzte Funktion des Arrays erhalten.
+0

Wird der MAX immer nur das letzte Objekt in Ihren Funktionen Array? – Ju66ernaut

+0

Nicht unbedingt ... so dass Sie nicht nur das letzte Element des Arrays schnappen könnten – dvsoukup

+0

* würde als MAX * betrachtet werden - wird MAX der Random Input Param sein? – RomanPerekhrest

Antwort

1

Die Lösung Array.sort, String.fromCharCode und String.charCodeAt Funktionen:

var someObject = { 
    "features" : [{ 
      "properties" : { "name" : "AB", "description" : null}, 
      "type" : "Feature" 
     }, { 
      "properties" : {"name" : "B", "description" : null}, 
      "type" : "Feature" 
     }, { 
      "properties" : { "name" : "AF", "description" : null}, 
      "type" : "Feature" 
     } 
    ], 
    "type" : "FeatureCollection" 
}; 

function getNext(data) { 
    data.features.sort(function(a,b){ 
     return a.properties.name.length - b.properties.name.length || 
       a.properties.name.localeCompare(b.properties.name); 
    }); 

    var last = data.features[data.features.length - 1].properties.name; 
    if (last.length === 1) { 
     return (last === "Z")? "AA" : String.fromCharCode(last.charCodeAt(0) + 1); 
    } else { 
     if (last === "ZZ") return last; // considering 'ZZ' as a limit 
     if (last[1] !== "Z") { 
      return last[0] + String.fromCharCode(last[1].charCodeAt(0) + 1); 
     } else if (last[1] === "Z"){ 
      return String.fromCharCode(last[0].charCodeAt(0) + 1) + "A"; 
     } 
    }  
} 

console.log(getNext(someObject)); // 'AG' 
+0

Danke! Ich habe dieses hier gewählt, weil es für meine Bedürfnisse funktioniert. Ich bin mir sicher, dass einige der anderen Antworten funktionieren, aber diese schien gerade zu dieser Zeit am besten zu sein. Allerdings gibt es ein kleines Problem damit in dieser Zeile muss eine Rückkehr zu tun ... so gibt es wirklich keine Notwendigkeit, eine "nächste" Variable zu haben: (last === "Z")? "AA": String.fromCharCode (last.charCodeAt (0) + 1); Könnten Sie Ihre Antwort aktualisieren, um das zu reflektieren? Andernfalls wird ein undefined zurückgegeben. – dvsoukup

+0

@dvsoukup, Sie hatten Recht. Ich habe das Ding repariert. Hör zu. Vielen Dank – RomanPerekhrest

0

können Sie die MAX-String finden mit:

var maxName = null, 
    obj = null, 
    name = null; 
for(var idx = 0; idx < features.length; ++idx){ 
    obj = features[idx]; 
    name = obj.properties.name; 
    if(maxName == null || name.length > maxName.length || 
     (name.length == maxName.length && name > maxName) 
    ){ 
     maxName = name; 
    } 
} 

Ich bin immer noch arbeiten, obwohl der nächste Name auf immer.

0

Ich denke, dass Sie sortieren möchten, was eigentlich JS hat eine schöne Funktion zum Vergleichen von Zeichenfolgen. Es würde jedoch zurückgeben, so dass Sie auch Länge berücksichtigen möchten.

Ich denke, das funktioniert.

function sortName(a, b){ 
    a = a.properties.name; 
    b = b.properties.name; 
    if(a.length>b.length){ 
     return 1; 
    } 
    if(a > b){ 
     return 1; 
    } 
    return -1; 
} 

console.log(someObject.features.sort(sortName)[0]. properties.name); 
+0

Das Sortieren ist eine ineffiziente Art, den Maximalwert in einem Array zu finden. Da Sie ohnehin eine Vergleichsfunktion schreiben müssen, können Sie einfach eine einzige Schleife durch das Array ausführen und den Maximalwert und seinen Index während der Ausführung verfolgen. Natürlich ist der Unterschied für ein kleines Array nicht signifikant, aber für ein größeres Array wäre die einzelne Schleife viel schneller als eine Sortierung. –

0

Sie können es

var obj = { 
     "features": [{ 
      "properties": { 
       "name": "A", 
       "description": null, 
      }, 
      "type": "Feature" 
     }, { 
      "properties": { 
       "name": "B", 
       "description": null, 
      }, 
      "type": "Feature" 
     }, { 
      "properties": { 
       "name": "C", 
       "description": null, 
      }, 
      "type": "Feature" 
     }], 
     "type": "FeatureCollection" 
    }; 


    var largest = Math.max.apply(Math, findProp(obj.features, "name")); 
    console.log(changeToStr(largest + 1)); 

mit tun Wo findProp wird der Wert der Eigenschaft Array erhalten wird changeToStr Nummer String Umwandlung und changeToNum konvertiert Nummer String.

function changeToNum(val) { 
     var base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
      i, j, result = 0; 

     for (i = 0, j = val.length - 1; i < val.length; i += 1, j -= 1) { 
      result += Math.pow(base.length, j) * (base.indexOf(val[i]) + 1); 
     } 
     return result; 
    }; 


    function changeToStr(number) { 
     var baseChar = ("A").charCodeAt(0), 
      letters = ""; 

     do { 
      number -= 1; 
      letters = String.fromCharCode(baseChar + (number % 26)) + letters; 
      number = (number/26) >> 0; 
     } while (number > 0); 

     return letters; 
    } 

    function findProp(obj, key, out) { 
     var i, 
      proto = Object.prototype, 
      ts = proto.toString, 
      hasOwn = proto.hasOwnProperty.bind(obj); 

     if ('[object Array]' !== ts.call(out)) out = []; 

     for (i in obj) { 
      if (hasOwn(i)) { 
       if (i === key) { 
        out.push(changeToNum(obj[i])); 
       } else if ('[object Array]' === ts.call(obj[i]) || '[object Object]' === ts.call(obj[i])) { 
        findProp(obj[i], key, out); 
       } 
      } 
     } 

     return out; 
    } 

Siehe die Arbeit Fiddle hier.

Verwandte Themen