-1

これは、私が尋ねることさえ恥ずかしい質問の 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 ループで各項目にアクセスして、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;
}
于 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 に答える