キーの「ベース」を取得し、元のインデックスを使用して、共通のベースを持つ項目を配列に追加します。(これにより、スパース配列が生成されます。) 次に、共通のベースを持つ各項目を'base'+enumeratedindex
.
ここでの秘訣はforEach
、配列を列挙するような方法を使用することです。これは、キーの元のインデックス部分を使用するだけでソート順を決定できるように、疎な配列で割り当てられたアイテムのみを参照します。
にアクセスできない場合forEach
は、配列アイテムにキーを含めることで、同様のタスクを実行できます。このような中間配列の代わりに:
{Friend: [undefined, "Bob", undefined, undefined, undefined, undefined, "Fred"]}
次のようなものがあります。
{Friend: [[6, 'Fred'],[1, 'Bob']]}
次に、配列をソートし、foreach ループで各項目にアクセスして、2 番目の項目を抽出します。
コードは次のとおりです。
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;
}