如果没有更高级的库,只需循环每对(使用hasOwnProperty
)并将键添加/附加到直方图,其中直方图键是对值,直方图值是连接键。然后反转直方图的键/值。
编辑:如果初始值不是字符串(并且不可逆地映射),那么现有的“身份哈希”库可能仍然可以使上述方法起作用。
或者,您可以映射[[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