より高い種類のライブラリがなければ、各ペアをループし ( を使用hasOwnProperty
)、ヒストグラム キーがペア値であり、ヒストグラム値が連結されたキーであるヒストグラムにキーを追加/追加します。次に、ヒストグラムのキー/値を逆にします。
編集:初期値が文字列でない場合 (および可逆的にマップされない場合)、既存の「ID ハッシュ」ライブラリでも上記のアプローチが機能する可能性があります。
または、マッピングしてソートし、バケット ソート[[k,v],...]
(既にソートされていると想像してください) に似たアプローチを使用して、出力パスの「等しいキー」の値をマージすることもできます。
次のようになります (コードにはバグがあるかもしれませんが、アプローチは適切です。値を比較する方法がある限り、任意のオブジェクトを値として使用することもできます)。
var _f = []
for (var k in map) {
if (map.hasOwnProperty(k)) {
_f.push({k: k, v: map[k]})
}
}
// you could also sort on name (a.k), if it's important
// this makes it more versatile and deterministic in output
// ordering than the histogram method above
var f = _f.sort(function (a, b) { return a.v < b.v ? 1 : a.v > b.v ? -1 : 0 })
var res = {}
var prev
var name = ""
// after the sort all {k:,v:} objects with the same values will be grouped
// together so we only need to detect the change to the next value
// and everything prior to that gets the merged key
for (var i = 0; i < f.length; i++) {
var p = f[i]
if (prev != p.v && name) {
res[name] = prev
name = ""
} else {
name = name + p.k
}
prev = p.v
}
if (name) { // don't forget last set of values
res[name] = prev
}
// have res