2016-05-13 2 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

Ну, вот мой подход. Не такой продвинутый, как Ненад.

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

Смежные вопросы