2016-05-11 3 views
1

私は問題ではありません5つのキーvar langDict = {};JavaScriptの辞書反転

IT-PL 
EN 
DE-FR 
ZH-CH 
IT-ES 

私はDE-FRが第2の位置に第1の位置とENになりたい、他の人を持っている辞書を持っています。

私は、以下の再帰的な方法を使用してこれを達成することを考えていますが、期待される結果は得られません。

for (var key in langDict) { 
    if (Object.keys(langDict).length > 0) { 
     langDict = filterKeys(langDict); 
    } 
} 

function filterKeys(langDict) { 
    for (var key in langDict) { 
     var langDictFiltered = {}; 
     if (key.indexOf("DE") > -1) { 
      langDictFiltered[key] = langDict[key]; 
      delete langDict[key]; 
      break; 
     } 
     if (key.indexOf("EN") > -1) { 
      langDictFiltered[key] = langDict[key]; 
      delete langDict[key]; 
      break; 
     } 
    } 

    return langDict; 
} 
+6

あなたはよりよいそれらのキーから新しい配列を作成し、その上で自分の行動を基礎と思います。オブジェクトのプロパティは順序付けられていません。 – raina77ow

+0

2つのプロパティ(DE、EN)は、そのような問題のための非常に小さなコストです - 手作業で注文してください。 – RomanPerekhrest

+0

どのような環境で実行していますか?プロパティトラバーサルのためのES6 [注文を定義する](http://www.2ality.com/2015/10/property-traversal-order-es6.html) –

答えて

2

オブジェクトは、特別な順序を持っていませんが、オブジェクト(Object.keys())のすべてのキーを取得し、 Array#sortとカスタムソートとソート順のハッシュテーブルを取ることができます。

その後、ソートされたキーで配列を使用してデータを取り込むことができます。

var keys = ['IT - PL', 'EN', 'DE - FR', 'ZH - CH', 'IT - ES']; 
 
keys.sort(function (a, b) { 
 
    function value(v) { 
 
     return { DE: 1, EN: 2 }[v.substring(0, 2)] || 10; 
 
    } 
 
    return value(a) - value(b); 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(keys, 0, 4) + '</pre>');

編集

文字列を分割し、最初の最も上位の値を取得してバージョン。

var keys = ['IT-PL', 'EN', 'DE-FR', 'ZH-CH', 'IT-ES', 'EN-DE-FR-CH-PL']; 
 
keys.sort(function (a, b) { 
 
    function value(v) { 
 
     return v.split('-').reduce(function (r, a) { 
 
      return Math.min(r, { DE: 1, EN: 2 }[a] || 10); 
 
     }, 10); 
 
    } 
 
    return value(a) - value(b); 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(keys, 0, 4) + '</pre>');

+0

キーは配列ではないOBJです。 Objキーは注文されていません –

+0

@RhysBradbury、私は何も主張していません。 –

+0

この値「EN-DE-FR-CH-PL」では、DEを最初に返すわけではありません。 - EN-DE-FR-CH-PLは単一の配列です。つまり、[EN、DE、FR] – user3674148