2016-05-06 3 views
-4

У меня есть массив объектов. В объектах есть shortkeys и некоторые из них не имеют shortkeys. Я хочу добавить свойство shortkeys ко всем объектам. Важно то, что мне нужно дать уникальный shortkeys всем объектам.Как добавить свойство в объект в порядке возрастания в javascript?

Тех объекты, которые не имеют shortkeys будет следовать этим условиям

  • если объект не shortkeys чем назначать shortkeys начиная с 1-9 как этим «Alt +-», 'альт +2' ... 'альт + 9'.
  • После 9 Мне нужно присвоить объекту объект 0.
  • Тогда мне нужно назначить a-z как этот «Alt + A», «Alt + B»
  • Важно мне нужно пропустить все shortkeys, который уже определен пример «Alt + M» .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

Просто интересно, что после того, как 'Alt + z'? –

+2

Я не уверен, что вы действительно приложили некоторые усилия к тому, что вы сделали (я надеюсь, что вы это сделали), но есть так много ошибок и недостающих частей, что я не могу притворяться, что трачу на это слишком много времени. Вот рабочее решение (из вашей скрипки): https://jsfiddle.net/krzz9zmf/2/. Обратите внимание, что вы не проверяли правильность и не заменяли значения и даже не ссылались на правую переменную (проверьте свою консоль **, она говорит вам, что что-то не получается **). Вы ссылались на myObj вместо obj. (Я даже не проверял, что все результаты верны, потому что логика отсутствует, это лучшее, что я могу сделать) – 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 ", shortkeys:" alt + 4 "}, иначе в тестовых исходных данных не было элемента с alt + # для проверки того, что решение пропустит число. – Taplar

1

Ошибки с существующей попытки (в сторону от не получать письма, которые вы хотите) было ...

  • вы использовали неправильное имя переменной myObj после объявления var obj
  • вы имели if (!'shortkeys' in myObj){ вместо if (!('shortkeys' in myObj)){
  • вы не в состоянии найти существующие shortkeys перед назначением одного

В этом коде, я ...

  • добавлен объект, который отслеживает все используемые сочетания клавиш, в том числе в настоящее время существующие
  • добавил цикл, который держит ищет уникальный shortkey, пока не будет обнаружен
  • добавил alpha переменную, которая должна использоваться, чтобы получить 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>

Note ...

  • Ваш ожидаемый результат имеет ошибку; он имеет alt+e дважды.
  • Там нет необходимости вручную создать массив значений начиная с символов карты с номерами
Смежные вопросы