2016-06-30 2 views
1

私はオブジェクトの配列を持っています。実際にオブジェクトはGeoJSON仕様に準拠しているので、そのことを念頭に置いてください。 「特性」オブジェクト内には、「名前」の特徴が存在する。この名前は、A、B、C ... blah ... Z、AA、ABなどとなります。 (私は、このような形状とするものではないとして、この質問には重要ではなかったいくつかの他のものを、取り除くでした...)JSONの例を参照してください:Javascript - オブジェクトの配列から次の文字を取り出します

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

私が何をしたいのですがどうしてMAXを見つけることです系列の中の次のものを返すために、この配列の配列内の文字。この例では、 'C'はMAXとみなされるため、 'D'の値を返す必要があります。もし私がAAを持っていたら、それはMAXとみなされ、 'AB'を返します。最大値が 'Z'だった場合は、 'AA'の値を返したいと思います。
小文字の使用を無視して、大文字の英字26文字のみを使用できます。他の文字はありません。

私はjavascript CharCodeAt(インデックス)のいくつかの使用法とMath.maxを適用し、+ 1を追加してから、それをASCII文字のrepresenationに変換することでこれを解決できると信じています...しかし、これを一緒にして、このすべてのものをループする働きをします。

ご了承ください。

更新: 次のコードを部分的に使用しています。しかし、それがZからAAにラップすると、それを動作させる方法をあまり理解していません。または、MAXがAFであると分かった場合は、AGを返します。 AZはBAを返さなければならないだろう。

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

他の既知のルール:

  • 上限はZZすることができます - 私は最大の文字は常に配列の最後ではありませんバックAAA
  • にラップする必要があるだろう非常に低いので、 は単に配列の最後の機能を取得できません。

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

    私はまだかかわらず、次の名前を得ることに取り組んでいる:

+0

は、MAXは常にちょうどあなたの機能の配列の最後の対象になりますか? – Ju66ernaut

+0

必ずしもそうではありませんので、配列の最後の要素を悩ますことはできませんでした。 – dvsoukup

+0

*はMAXとみなされます* - MAXはランダム入力パラメータですか? – RomanPerekhrest

答えて

1

Array.sortString.fromCharCodeString.charCodeAt機能使用したソリューション:

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

ありがとう!私はこれが私の必要性のために働くので、これを選んだ。私は他の答えのいくつかが動作すると確信していますが、この1つはちょうどその時点で最高のようだ。しかし、この行にはちょっとした問題があり、この行ではリターンを行う必要があります。したがって、次の変数を持つ必要はありません。(最後の=== "Z")? "AA":String.fromCharCode(last.charCodeAt(0)+ 1);それを反映するためにあなたの答えを更新できますか?それ以外の場合は、未定義を返します。 – dvsoukup

+0

@dvsoukup、あなたは正しいです。私はそれを修正した。見てみな。ありがとう – RomanPerekhrest

0

あなたがMAXの文字列を見つけることができます。

0

私はあなたがソートしたいと思う、実際にJSは文字列を比較するための素晴らしい機能を持っています。しかし、それは("AA" > "Z") === trueを返すので、長さも考慮する必要があります。

私はこれがうまくいくと思います。

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

並べ替えは、配列内の最大値を見つけるのに非効率的な方法です。とにかく比較関数を記述する必要があることを考えれば、単純に配列全体を1回ループし、最大値とそのインデックスを追跡します。もちろん、小さな配列の場合、その差は重要ではないかもしれませんが、より大きい配列の場合、単一のループはソートよりもはるかに高速です。 –

0

あなたはfindPropは、プロパティ値の配列を取得している

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

を使用してそれを行うことができ、changeToStrは、数値を文字列に変換され、changeToNumは、数値を文字列に変換されます。

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

ここでは、作業Fiddleを参照してください。

関連する問題