2016-05-13 42 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>");