2013-07-13 2 views
0

Самый элегантный способ превратить это:JavaScript: Как превратить словарь в список элементов?

{ 
    'a': 'aa', 
    'b': 'bb' 
} 

в этом:

[ 
    ['a', 'aa'], 
    ['b', 'bb'] 
] 
+0

Не было бы это скорее объектом массива, а не словарем для элементов? – adeneo

+0

«Самый элегантный» будет зависеть от вашего личного определения «элегантный». В чем проблема? Вы не знаете, как это сделать, или вам просто не нравится ваше решение? –

+0

Любопытный - зачем вам это нужно как массив? Разве вы не можете его потреблять, как есть? – cirrus

ответ

8

Просто перебирать ключи:

var dict = { 'a': 'aa', 'b': 'bb' }; 
var arr = []; 

for (var key in dict) { 
    if (dict.hasOwnProperty(key)) { 
     arr.push([ key, dict[key] ]); 
    } 
} 

Fiddle (обновлено на @ комментарий Джека, только добавить прямые свойства)

+4

Не забывайте 'hasOwnProperty()' check :) –

+0

@ Спасибо, обновил мой ответ, чтобы включить это ... – McGarnagle

+0

даже безопаснее {} .hasOwnProperty.call (dict, key). таким образом, в маловероятном случае, когда словарь содержит ключ, называемый «hasOwnProperty», это все равно будет работать –

2

Использование lodash.js (или underscore.js)

var obj = {'a': 'aa', 'b': 'bb'}; 

_.pairs(obj); 

//[['a', 'aa'], ['b', 'bb']] 

lodash.js является стремящимся преемником underscore.js, возник как ответвление от исходного проекта. По моему мнению, он должен использоваться для тех, кто ценит свое время.

+0

Ссылка на lodash поможет :) –

+0

Кажется, я читал ваш ум @Jack :) – finishingmove

+0

Никогда не слышал о lib раньше, но выглядит красиво, и это может быть с учетом специфических требований :) –

1

Если у вас есть браузер, который поддерживает Object.getOwnPropertyNames и Array.prototype.map

var obj = {'a': 'aa', 'b': 'bb'}, arr; 
arr = Object.getOwnPropertyNames(obj).map(function(e) {return [e, obj[e]];}); 
// [["a", "aa"], ["b", "bb"]] 

поддержки браузера стол here


Как Crazy Trainpoints out, если вы заинтересованы только в перечислимых свойств, Object.keys тоже будет работать. В этом примере оба будут иметь одинаковый результат.

+0

Просто интересно, почему 'Object.getOwnPropertyNames' вместо' Object.keys'? –

+0

... но +1 для решения '.map()'. –

+0

@CrazyTrain 'Object.keys' тоже работает, afaik - единственная разница между ними:' Object.getOwnPropertyNames' возвращает неперечислимые свойства, а также перечислимые. Мне казалось, что OP хочет весь _Object_, независимо от перечислимости. –

1

Я хотел бы рассмотреть следующее решение очень элегантна:

function toList(dict) { 
    return Object.keys(dict).map(function (key) { 
     return [key, dict[key]]; 
    }); 
} 

Теперь вы можете использовать его следующим образом:

var list = toList({ 
    a: "aa", 
    b: "bb" 
}); 

Он работает во всех современных браузерах без необходимости использования внешних библиотек. См. Демо: http://jsfiddle.net/pEhpu/

+0

Очень похоже на ответ Павла на самом деле :) –

+0

@Jack Это почти то же самое. –

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