如何在 JavaScript 中以递增顺序在对象中添加属性
how to add property in object in increasing order in javascript?
>我有对象数组。在对象中,有些具有shortkeys
属性,有些没有shortkeys
属性。我想shortkeys
属性添加到所有对象。重要的是我需要为所有对象提供独特的shortkeys
。
那些没有shortkeys
的对象将遵循这些条件
- 如果对象没有
shortkeys
则分配从 1-9 开始shortkeys
,例如"Alt+1"、"Alt+2"..."Alt+9"。 9
之后,我需要0
属性分配给对象。- 然后我需要分配像"alt+a","alt+b"这样的
a-z
- 重要的是我需要跳过已经定义的示例"alt+m"的所有
shortkeys
,以便每个对象都具有唯一的属性。
这是我的代码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"},
]
您可以浏览并删除作为键存在的字符,然后返回并添加剩余的内容
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);
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>
您现有尝试的错误(除了没有得到您想要的字母(是......
- 您在声明
var obj
后myObj
使用了错误的变量名 - 你有
if (!'shortkeys' in myObj){
而不是if (!('shortkeys' in myObj)){
- 在分配现有
shortkeys
之前,您未能查找现有
在此代码中,我...
- 添加了一个跟踪所有已使用的快捷键(包括当前存在的快捷键(的对象
- 添加了一个循环,该循环会不断寻找唯一的快捷键,直到找到一个
- 添加了用于获取
a-z
字符的alpha
变量 - 在主
for
循环中添加了一个OUTER
标签,以便我们可以在超过字母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 {
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
。 - 无需手动创建值数组,因为字符映射到数字
相关文章:
- Javascript-根据赋值顺序,按键合并对象数组
- 如何按对象反转Angular ngRepeat的顺序's键,这些键是数字键
- 按特定顺序对对象进行排序—Angular
- 如何在 JavaScript 中以递增顺序在对象中添加属性
- JavaScript:指定对象中属性的顺序
- 对象的顺序已更改
- Javascript对象多个循环,相同的顺序
- 如何使用下划线根据自定义排序顺序对对象数组进行排序
- 对象在循环中运行时未定义,但在按顺序执行时未定义
- AngularJS-ngRepeat对对象的返回顺序与vanillar.in循环不同
- ng重复javascript对象中未按预期顺序重复的项
- 如何像java脚本中给定的对象一样,将对象的属性保持在相同的顺序
- javascript:按实际顺序获取对象项
- 在JavaScript中,对象如何跟踪键/值的插入顺序
- 如何根据不同排序顺序的多个值对json对象进行排序
- three.js:透明对象根据相机角度按错误顺序渲染
- 按数组顺序排列对象
- 通过多次调用按顺序将对象插入数组
- jQuery - 本地存储排序字符串化对象顺序
- 重置对象顺序