2016-05-13 38 views
-3

我有很多一對一的映射對象:排序由值映射在javascript

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

現在我想實現從這個以下對象:

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

什麼是最有效的方法在JavaScript中執行此操作(如果有幫助,我們也可以使用下劃線庫) 注意:上述對象只是實際問題的較短版本。

+2

你寫過什麼代碼來解決這個問題? –

+0

你自己的任何嘗試? –

+0

我們可以嘗試幫助您,但您必須先嚐試。告訴我們你的第一個方法,然後你會收到一些建議,我確信它。 – dlopez

回答

1

你可以用Object.keys()做到這一點,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)

你也可以使用forEach,並加入到創建的對象

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)

1

嗯,這是我的方法。雖然不像Nenad那樣先進。

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

這正是我以前也曾經想過的 – 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

單襯

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>");