2016-05-06 33 views
-4

我有数组对象。在对象中有的有shortkeys属性,有的没有shortkeys属性。我想将shortkeys属性添加到所有对象。 重要的是我需要给所有对象赋予唯一的shortkeys如何在javascript中按递增顺序添加对象中的属性?

不具有shortkeys将遵循这些条件下这些对象

  • 如果对象没有shortkeys比它分配shortkeys1-9开始这样的“ALT + 1”,'ALT +2' ... 'ALT + 9'。
  • 9我需要将0属性分配给对象。
  • 然后我需要分配a-z像“ALT + A”,“ALT + B”
  • 重要我需要跳过其中已定义示例的“ALT + M”所有shortkeys是.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'。 – 2016-05-06 13:21:51

回答

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

与您现有的尝试(除了没有得到你想要的字母)的错误是......

  • 您正在使用宣布后的错误变量名称myObjvar obj
  • 你有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两次。
  • 没有必要手动创建以来字符值的数组映射到数字
相关问题