Sin una biblioteca de tipo superior, simplemente haga un bucle cada par (use hasOwnProperty
) y agregue/añada la clave a un histograma donde la clave del histograma es el valor del par y los valores del histograma son las claves concatenadas. A continuación, invierta la clave/valores del histograma.
Editar: Si los valores iniciales no son cadenas (y no se pueden mapear de forma reversible), entonces una biblioteca existente 'hash de identidad' podría permitir que el enfoque anterior funcione.
Como alternativa, puede asignar decir, [[k,v],...]
y clasificar y luego utilizar un enfoque similar al de un bucket sort (imagina que ya está ordenadas) para combinar los valores de "claves iguales" en el pase de salida.
Puede ir como esto (mientras que el código puede tener errores, el enfoque es el sonido - que también trabajará con objetos arbitrarios como los valores, siempre y cuando usted tiene una manera de comparar los valores):
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
Estaba solo levantando esa idea. Pero, ¿qué sucede si uno de los valores no es una cadena? – sprugman
@sprugman ah bueno eso hace las cosas un poco más involucradas ... – Pointy
Sí, después de la prueba, si tiene un objeto como valor, termina con filas de resultados como {x: "[object Object]"} – sprugman