-1

这是我什至羞于问的问题之一,但我正在使用外部 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 的 String.indexOf() 版本允许使用正则表达式?

你可以推荐什么策略来做到这一点?我会在稍后发布我所在的位置。非常感谢!

4

2 回答 2

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;
}
于 2013-03-28T21:19:03.533 回答
0

您可以尝试执行以下操作:

{
 friend: new Array(),
 friendFinder: new Array()
}

那么你就可以:

friend.push() - 添加到数组

var index =friend.indexOf("Bob") - 在数组中查找

friend.splice(index, 1) - 从数组中删除索引 1 是要删除的数字。

于 2013-03-28T21:18:46.120 回答