2016-05-06 10 views
-4

オブジェクトの配列があります。オブジェクトにはshortkeysプロパティがあり、一部にはshortkeysプロパティがありません。すべてのオブジェクトにshortkeysプロパティを追加したいと思います。 重要なことは、すべてのオブジェクトにユニークなshortkeysを付ける必要があるということです。これらの条件に従いますshortkeysを持っていないjavascriptでオブジェクトのプロパティを昇順に追加する方法は?

これらのオブジェクト

  • それは「ALT + 1」、 'ALTよう1-9から始まるshortkeysを割り当てるよりも、オブジェクトがshortkeysを持っていない場合+2 '...' alt + 9 'を押します。
  • 9の後にオブジェクトに0プロパティを割り当てる必要があります。
  • その後、私は、私はすでに定義されているすべてのshortkeys例に「Alt + M」をスキップする必要がある重要
  • に「Alt + b」が、それに「Alt + A」のようなa-zを割り当てる必要がありますが、すべてのオブジェクトは、ユニークな特性を持っていることの.so 。ここで

は私のコード https://jsfiddle.net/krzz9zmf/

var arr=[ 
    {name:"abc",shortkeys:"alt+m"}, 
    {name:"c_1"}, 
    {name:"abc",shortkeys:"alt+t"}, 
    {name:"abc",shortkeys:"alt+c"}, 
    {name:"wes_2"}, 
    {name:"ncv_3"}, 
    {name:"sghb_4"}, 
    {name:"ijo_5"}, 
    {name:"nhio_6"}, 
    {name:"jion_7"}, 
    {name:"chudoi_8"}, 
    {name:"bdmki_9"}, 
    {name:"dssd_0"}, 
    {name:"sdfs_a"}, 
    {name:"abc",shortkeys:"alt+y"}, 
    {name:"abc",shortkeys:"alt+e"}, 
    {name:"sghb_b"}, 
    {name:"ijo_d"}, 
    {name:"gsha_e"}, 
    {name:"asdas_f"}, 
    {name:"bbb_g"}, 
    {name:"mko_h"}, 
    {name:"kioh_i"}, 
    {name:"qwee_j"}, 
    {name:"qwee_k"}, 
    {name:"qwee_l"}, 
    {name:"qwee_n"}, 

] 

var j =1; 
for(var i=0;i<arr.length;i++){ 
    var obj =arr[i]; 
    if (!'shortkeys' in myObj){ 
    //add shorkeys start from 1-9 then 0 and then a-z.In other words need to assign shortcut key like that 'alt+1','alt+2'....'alt+0'''alt+a','alt+b'...'alt+z'; 
    //some of the objects already define shortkeys example 'alt+m' .so I need to skip these shortcut key .so that each item have unique shortcut. 
    myObj.shortkeys= 'alt+'+j; 
    j++; 
    if(j==10){ 
     j=0 
    } 
    if(j==1){ 
     myObj.shortkeys='alt+a'; 
    } 
    } 
} 

予想される出力である

[ 
{name:"abc",shortkeys:"alt+m"}, 
{name:"c_1",,shortkeys:"alt+1"}, 
{name:"abc",shortkeys:"alt+t"}, 
{name:"abc",shortkeys:"alt+c"}, 
{name:"wes_2",shortkeys:"alt+2"}, 
{name:"ncv_3",,shortkeys:"alt+3"}, 
{name:"sghb_4",shortkeys:"alt+4"}, 
{name:"ijo_5",shortkeys:"alt+5"}, 
{name:"nhio_6",shortkeys:"alt+6"}, 
{name:"jion_7",shortkeys:"alt+7"}, 
{name:"chudoi_8",shortkeys:"alt+8"}, 
{name:"bdmki_9",shortkeys:"alt+9"}, 
{name:"dssd_0",shortkeys:"alt+0"}, 
{name:"sdfs_a",shortkeys:"alt+a"}, 
{name:"abc",shortkeys:"alt+y"}, 
{name:"abc",shortkeys:"alt+e"}, 
{name:"sghb_b",shortkeys:"alt+b"}, 
{name:"ijo_d",shortkeys:"alt+d"}, 
{name:"gsha_e",shortkeys:"alt+e"}, 
{name:"asdas_f",shortkeys:"alt+f"}, 
{name:"bbb_g",shortkeys:"alt+g"}, 
{name:"mko_h",shortkeys:"alt+h"}, 
{name:"kioh_i",shortkeys:"alt+i"}, 
{name:"qwee_j",shortkeys:"alt+j"}, 
{name:"qwee_k",shortkeys:"alt+k"}, 
{name:"qwee_l",shortkeys:"alt+l"}, 
{name:"qwee_n",shortkeys:"alt+n"}, 

] 
+0

にマップするので、手動で値の配列を作成する必要はありませんか? –

+2

あなたがしたことに本当に力を入れているのかどうかはわかりませんが(私がやりたがっていると思いますが)、エラーや欠けている部分がたくさんあります。ここでは、(あなたのフィドルからの)実用的な解決策です:https://jsfiddle.net/krzz9zmf/2/。あなたが正しくチェックしておらず、値を置き換えず、正しい変数を参照していない(コンソールを確認してください。あなたはobjの代わりにmyObjを参照していました。 (論理がないのですべての結果が正しいことを確認していない、これは私ができる最高です) – briosheje

+0

あなたの質問は実際には何も言わなかったが、あなたのコードは 'var obj'を持っていますが、代わりに 'myObj'を使います。 –

答えて

1

あなたが通過し、キーが戻って行くと残るものを追加として存在する文字を削除することができます

https://jsfiddle.net/stevenkaspar/krzz9zmf/8/

var alpha_num_array = [ 
'1','2','3','4', 
'5','6','7','8','9', 
'0', 
'a','b','c','d','e', 
'f','g','h','i','j', 
'k','l','m','n','o', 
'p','q','r','s','t', 
'u','v','w','x','y', 
'z']; 

key_arr.map(function(k){ 
    if(!k.shortkeys) return; 

    var key = k.shortkeys.split('+')[1]; 
    var key_index = alpha_num_array.indexOf(key); 
    alpha_num_array.splice(key_index, 1); 

}) 

key_arr = key_arr.map(function(k){ 
    if(k.shortkeys) return k; 

    k.shortkeys = 'alt+'+alpha_num_array[0]; 
    alpha_num_array.shift(); 
    return k; 
}) 

console.log(key_arr); 
+0

を追加しないでください。この回答を削除してください – user944513

+0

もう一度お試しください。配列が並べ替えられて1〜9,0、azオーダー –

+0

を共有してくださいjsfiddle – user944513

1

var arr=[ 
 
    {name:"abc",shortkeys:"alt+m"}, 
 
    {name:"c_1"}, 
 
    {name:"abc",shortkeys:"alt+t"}, 
 
    {name:"abc",shortkeys:"alt+c"}, 
 
    {name:"wes_2"}, 
 
    {name:"ncv_3"}, 
 
    {name:"sghb_4"}, 
 
    {name:"ijo_5"}, 
 
    {name:"nhio_6"}, 
 
    {name:"jion_7"}, 
 
    {name:"chudoi_8"}, 
 
    {name:"bdmki_9"}, 
 
    {name:"dssd_0"}, 
 
    {name:"sdfs_a"}, 
 
    {name:"abc",shortkeys:"alt+4"}, 
 
    {name:"abc",shortkeys:"alt+e"}, 
 
    {name:"sghb_b"}, 
 
    {name:"ijo_d"}, 
 
    {name:"gsha_e"}, 
 
    {name:"asdas_f"}, 
 
    {name:"bbb_g"}, 
 
    {name:"mko_h"}, 
 
    {name:"kioh_i"}, 
 
    {name:"qwee_j"}, 
 
    {name:"qwee_k"}, 
 
    {name:"qwee_l"}, 
 
    {name:"qwee_n"}, 
 
]; 
 

 
//possible shortkeys reversed so we can pop them off 
 
var keys = [ 
 
    '1','2','3','4','5','6','7','8','9','0' 
 
    ,'a','b','c','d','e','f','g','h','i','j' 
 
    ,'k','l','m','n','o','p','q','r','s','t' 
 
    ,'u','v','w','x','y','z'].reverse(); 
 
//elements without a shortkeys 
 
var tagsWithoutShortcuts = arr.filter(function(element){ return typeof element.shortkeys === 'undefined'; }); 
 

 
console.log(keys); 
 
console.log(tagsWithoutShortcuts); 
 

 
tagsWithoutShortcuts.forEach(function(tag){ 
 
    var key = keys.pop(); 
 
    //while key is already used, get another 
 
    while (arr.filter(function(element){ return element.shortkeys === 'alt+'+ key; }).length) key = keys.pop(); 
 
    //put the shortkeys on the tag 
 
    tag.shortkeys = 'alt+'+ key; 
 
}); 
 

 
console.log(arr);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

+0

出力が間違っています.. 'alt + 4'が見つかりません – user944513

+0

あなたの出力は期待されていませんoutput.soこの答えを削除してください – user944513

+0

私はalt + 4を開始時にarr []に入れました。もう一度チェック。 '{name:" abc "、ショートカット:" alt + 4 "}、'そうでなければ、テスト開始データにalt +#を持つ要素がなく、ソリューションが数値をスキップすることをテストします。 – Taplar

1

(余談したい文字を得ていないから)既存の試みとエラーが...

  • に使用していたということでした間違った変数名myObj宣言後var obj
  • あなたはこのコードでは、I 1

を割り当てる前に、既存のshortkeysを探すために失敗した代わりにif (!('shortkeys' in myObj)){

  • if (!'shortkeys' in myObj){を持っていました...

    • は現在、既存のもの
    • を含め、すべての使用ShortKeysはを追跡するオブジェクトを追加したものが
    • を取得するために使用されるalpha変数を追加発見されるまで、ユニークなshortkeyを探し続けてループを追加しましたa-z文字
    • OUTERというラベルをメインのforループに追加して、ループを破ることができます。これは、文字がzを超えた場合に発生します。ラベルは内側のdo-whileループから壊れているので必要です。

    var arr=[ 
     
        {name:"abc",shortkeys:"alt+m"}, {name:"c_1"}, {name:"abc",shortkeys:"alt+t"}, {name:"abc",shortkeys:"alt+c"}, 
     
        {name:"wes_2"}, {name:"ncv_3"}, {name:"sghb_4"}, {name:"ijo_5"}, {name:"nhio_6"}, {name:"jion_7"}, 
     
        {name:"chudoi_8"}, {name:"bdmki_9"}, {name:"dssd_0"}, {name:"sdfs_a"}, {name:"abc",shortkeys:"alt+y"}, 
     
        {name:"abc",shortkeys:"alt+e"}, {name:"sghb_b"}, {name:"ijo_d"}, {name:"gsha_e"}, {name:"asdas_f"}, 
     
        {name:"bbb_g"}, {name:"mko_h"}, {name:"kioh_i"}, {name:"qwee_j"}, {name:"qwee_k"}, {name:"qwee_l"}, {name:"qwee_n"} 
     
    ] 
     
    
     
    var j = 1; 
     
    var alpha = 'a'.charCodeAt(0); // Number for the 'a-z' chars 
     
    var z = 'z'.charCodeAt(0); // Number for the 'z' character 
     
    var shorts = {}; // Holds all shortkeys to avoid duplicates 
     
    var short = ""; 
     
    
     
    // First gather all the existing shortkeys 
     
    for (var i = 0; i < arr.length; i++) { 
     
        if (arr[i].shortkeys) { 
     
        shorts[arr[i].shortkeys] = arr[i].shortkeys 
     
        } 
     
    } 
     
    
     
    OUTER: 
     
    for (var i = 0; i < arr.length; i++) { 
     
        var myObj = arr[i]; 
     
        
     
        if (!('shortkeys' in myObj)) { 
     
        // We want to make sure that our "short" is not yet used. 
     
        do { 
     
         if (j < 10) { 
     
         short = 'alt+' + j 
     
         j++; 
     
         
     
         } else if (j == 10) { 
     
         short = 'alt+0' 
     
         j++; 
     
         
     
         } else if (alpha <= z) { 
     
         short = 'alt+' + String.fromCharCode(alpha); 
     
         alpha++; 
     
         
     
         } else { 
     
         \t break OUTER; // We've moved beyond 'z', so just quit. 
     
         } 
     
        } while(short in shorts) 
     
        
     
        // Track the new shortkey, and assign it 
     
        shorts[short] = short 
     
        myObj.shortkeys = short 
     
        } 
     
    } 
     
    
     
    document.querySelector("pre").textContent = JSON.stringify(arr, null, 4)
    <pre></pre>

    注...

    • あなたの予想出力は間違いがあります。 alt+eが2回あります。
    • 文字はただ、何の後に `ALT + z`を不思議番号
  • 関連する問題