这是我甚至羞于询问的问题之一,但我正在使用外部JSON源,我不得不做一些丑陋的事情。所以这里......
我有'脏'的Javascript对象,其末尾包含一个数字的属性名称:
{ "Friend1" : "Bob",
"Friend6" : "Fred",
"Friend632" : "Gonzo",
"FriendFinder1" : "Dolly",
"FriendFinder4294" : "Jan"
}
我正在试图找出一种清理/“零索引”这些属性名称的方法,以便对象看起来像:
{ "Friend0" : "Bob",
"Friend1" : "Fred",
"Friend2" : "Gonzo",
"FriendFinder0" : "Dolly",
"FriendFinder1" : "Jan"
}
我正在引用这个indexOf / Regex代码: Is there a version of JavaScript's String.indexOf() that allows for regular expressions?
您可以推荐的任何策略吗?我会发布一下我所处的位置。非常感谢!
答案 0 :(得分:1)
获取键的“基础”,并使用原始索引将具有公共基础的项目附加到数组。 (这会生成一个稀疏数组。)然后通过将具有公共基数的每个项目枚举到一个'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;
}
答案 1 :(得分:0)
您可以尝试执行以下操作:
{
friend: new Array(),
friendFinder: new Array()
}
然后你可以:
friend.push() - 添加到数组
var index = friend.indexOf(“Bob”) - 在数组中找到
friend.splice(index,1) - 从索引处的数组中删除1是要删除的数字。