2016-05-13 2 views
-3

Ich habe ein Objekt mit vielen-zu-Eins-Abbildung:von Wert in Karten in Javascript Sortierung

{ 
    'a' : 'one', 
    'b' : 'two', 
    'c' : 'one', 
    'd' : 'two' 
} 

Jetzt möchte ich folgendes Objekt von diesem machen:

{ 
    'one' : ['a' , 'c'], 
    'two' : ['b' , 'd'] 
} 

Was ist effizienteste Methode, dies in Javascript zu tun (wir können auch Unterstrich-Bibliotheken verwenden, wenn es hilft) Hinweis: Die obigen Objekte sind nur eine kürzere Version des eigentlichen Problems.

+2

welcher Code das Problem geschrieben haben, zu lösen? –

+0

jeder Versuch von dir selbst? –

+0

Wir können versuchen, Ihnen zu helfen, aber Sie müssen es zuerst versuchen. Zeig uns deine erste Herangehensweise und dann wirst du einige Vorschläge bekommen, da bin ich mir sicher. – dlopez

Antwort

1

Sie können dies tun, mit Object.keys() und reduce

var data = {'a': 'one','b': 'two','c': 'one','d': 'two'} 
 

 
var result = Object.keys(data).reduce((res, e) => { 
 
    res[data[e]] = (res[data[e]] || []).concat(e); 
 
    return res; 
 
}, {}); 
 

 
console.log(result)

Sie auch forEach nutzen könnten und

var data = {'a': 'one','b': 'two','c': 'one','d': 'two'}, r = {} 
 

 
Object.keys(data).forEach(e => {r[data[e]] = (r[data[e]] || []).concat(e)}); 
 
console.log(r)

zu erstellenden Objekt hinzufügen
1

Nun, hier ist mein Ansatz. Nicht so fortgeschritten wie Nenads.

var obj = { 
    'a' : 'one', 
    'b' : 'two', 
    'c' : 'one', 
    'd' : 'two' 
}; 

var result = {}; 

for (var i in obj) { 
    if (obj[i] in result) { 
    result[obj[i]].push(i); 
    } else { 
    result[obj[i]] = [i]; 
    } 
} 

console.log(result); 
+1

Genau das hatte ich mir auch vorher gedacht – user3126841

2
var data = { 
    'a' : 'one', 
    'b' : 'two', 
    'c' : 'one', 
    'd' : 'two' 
} 

var result = {}; 

for(var key in data) { 
    var val = data[key]; 
    if(!result[val]) result[val] = []; 

    result[val].push(key); 
} 

console.log(result); 
1

ein einzelner Liner

var map = { 
 
    'a' : 'one', 
 
    'b' : 'two', 
 
    'c' : 'one', 
 
    'd' : 'two' 
 
}, 
 

 
reduced = Object.keys(map).reduce((p,c) => {!!p[map[c]] ? p[map[c]].push(c) : p[map[c]] = [c]; return p},{}) 
 

 
document.write("<pre>" + JSON.stringify(reduced) + "</pre>");