Bez biblioteki o wyższych parametrach po prostu zapętlaj każdą parę (użyj hasOwnProperty
) i dodaj/dodaj klucz do histogramu, w którym klucz histogramu jest wartością pary, a wartości histogramu są połączonymi kluczami. Następnie odwróć klucz/wartości histogramu.
Edit: Jeśli wartości początkowe nie są ciągi (a nie map odwracalnie) następnie istniejącą bibliotekę „hash tożsamość” może jeszcze włączyć powyższą podejście do pracy.
Alternatywnie można odwzorować, aby powiedzieć, [[k,v],...]
i posortować, a następnie zastosować podejście podobne do bucket sort (wyobraź sobie, że jest już posortowane), aby scalić wartości "równych kluczy" w przejściu wyjściowym.
może iść tak (natomiast kod może mieć błędy, podejście jest dźwięk - będzie również współpracować z dowolnymi przedmiotami jak wartości tak długo, jak masz sposób na porównanie wartości):
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
Po prostu wr pomysł. Ale co się stanie, jeśli jedna z wartości nie jest łańcuchem? – sprugman
@sprugman ah well, który sprawia, że rzeczy nieco bardziej zaangażowane ... – Pointy
Tak, po przetestowaniu, jeśli obiekt ma wartość, kończy się wiersz wyników, taki jak {x: "[object Object]"} – sprugman