在Javascript中,我如何重命名/重新编号一组属性
In Javascript, how can I Rename/Renumber a set of properties?
这是一个我甚至羞于问的问题,但我正在使用外部JSON源,我被迫做一些丑陋的事情。
我有一个"脏"的Javascript对象,属性名的末尾包含一个数字:
{ "Friend1" : "Bob",
"Friend6" : "Fred",
"Friend632" : "Gonzo",
"FriendFinder1" : "Dolly",
"FriendFinder4294" : "Jan"
}
我试图找出一种方法来清理/"零索引"这些属性名称,使对象看起来像:
{ "Friend0" : "Bob",
"Friend1" : "Fred",
"Friend2" : "Gonzo",
"FriendFinder0" : "Dolly",
"FriendFinder1" : "Jan"
}
我引用这个indexOf/Regex代码:是否有一个版本的JavaScript's String.indexOf()允许正则表达式?
你有什么策略可以推荐吗?我一会儿就会公布我的进展。很多谢谢!
取键的"基数",并使用原始索引将具有公共基数的项附加到数组中。(这会生成一个稀疏数组。)然后通过将具有公共基的每个项枚举为具有'base'+enumeratedindex
的新键来再次扩展它。
这里的技巧是使用像forEach
这样的方法枚举数组——这将只访问稀疏数组中的分配项,允许您仅通过使用键的原始索引部分来确定排序顺序。
如果您没有访问forEach
的权限,您可以通过在数组项中包含键来完成类似的任务。而不是像这样的中间数组:
{Friend: [undefined, "Bob", undefined, undefined, undefined, undefined, "Fred"]}
你有一个这样的:
{Friend: [[6, 'Fred'],[1, 'Bob']]}
然后对数组进行排序,并在foreach循环中访问每一项,提取第二项。
代码如下:
function rekey(obj) {
var rekey = /^(.*?)('d+)$/;
var nestedobj = {}, newobj = {};
var key, basekeyrv, newkey, oldidx, newidx;
function basekey(key) {
return rekey.exec(key).splice(1);
}
for (key in obj) {
if (obj.hasOwnProperty(key)) {
basekeyrv = basekey(key);
newkey = basekeyrv[0];
oldidx = parseInt(basekeyrv[1], 10);
if (!nestedobj[newkey]) {
nestedobj[newkey] = [];
}
nestedobj[newkey][oldidx] = obj[key];
}
}
for (key in nestedobj) {
if (nestedobj.hasOwnProperty(key)) {
newidx = 0;
nestedobj[key].forEach(function(item){
newobj[key+newidx++] = item;
});
}
}
return newobj;
}
rekey({
"Friend1" : "Bob",
"Friend6" : "Fred",
"Friend632" : "Gonzo",
"FriendFinder1" : "Dolly",
"FriendFinder4294" : "Jan"
});
生产
{Friend0: "Bob",
Friend1: "Fred",
Friend2: "Gonzo",
FriendFinder0: "Dolly",
FriendFinder1: "Jan"}
或者,不使用forEach
:
function rekey(obj) {
var rekey = /^(.*?)('d+)$/;
var nestedobj = {}, newobj = {};
var key, basekeyrv, newkey, oldidx, newidx;
function basekey(key) {
return rekey.exec(key).splice(1);
}
for (key in obj) {
if (obj.hasOwnProperty(key)) {
basekeyrv = basekey(key);
newkey = basekeyrv[0];
oldidx = parseInt(basekeyrv[1], 10);
if (!nestedobj[newkey]) {
nestedobj[newkey] = [];
}
nestedobj[newkey].push([oldidx, obj[key]]);
}
}
for (key in nestedobj) {
if (nestedobj.hasOwnProperty(key)) {
nestedobj[key].sort();
for (newidx = 0; newidx < nestedobj[key].length; newidx++) {
newobj[key+newidx] = nestedobj[key][newidx][1];
}
}
}
return newobj;
}
你能试着这样做吗:
{
friend: new Array(),
friendFinder: new Array()
}
那么你可以:
friend.push() -添加到数组
var index = friend.indexOf("Bob") - find in array
的朋友。Splice (index, 1) -从索引1处的数组中删除要删除的数字
相关文章:
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 全局变量和全局对象的属性之间有什么区别吗
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 序列化数据属性中对象的最可靠方法
- 分析高度属性时出现意外值{{specs.height}}.index.html
- TypeError:无法读取属性'推'未定义的JavaScript
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- AngularJS-使用'true'属性
- 可以't使用JavaScript获取width属性
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- JavaScript Pub/Sub属性访问问题
- 如何循环访问对象中的编号属性
- 下划线 JS - 重新编号模板呈现的元素属性
- 属性的 SVG 编号项不起作用
- Sencha默认情况下将只读属性添加到'外部字段编号'类型
- 在Javascript中,我如何重命名/重新编号一组属性
- 数组中不同属性值对象的 Javascript 编号
- 按属性名称列出的结果的XML编号