Как мне нажать ключи от объекта к массиву? - PullRequest
2 голосов
/ 03 мая 2011

Предположим, у меня есть следующий объект obj:

obj = {
    'key1' : ['1','2','3'],
    'key2' : ['1','2','9'],
    'key3' : ['1','3','5']
}

Как я могу преобразовать obj в два массива, которые выглядят следующим образом?

allOfTheKeys = ['key1','key2','key3']

allOfTheArrays = ['1','2','3','5','9']

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

Что-то вроде

allKeys = [];
allElems = [];

for(var k in obj){
   allKeys.push(k);
   for(var e in obj[k]){
      allElem.push(e)
   }
}

На самом деле, в jQuery вы можете сделать это более кратко, используя each() (предупреждение, это не проверенный код):

jQuery.each(obj,function(key){
    allKeys.push(key); 
    jQuery.each(obj[key],function(elem){
        allElems.push(elem);
    }
});

Хорошо, вы не хотите повторений, добавьте

if(!(elem in allElems)) allElems.push(elem);
1 голос
/ 03 мая 2011

Как я видел, другие ответы возвращают повторяющиеся значения. Здесь у вас есть решение ( проверено ):

var allOfTheKeys = [], allOfTheArrays = [], nonRepeatedElems = {};
for(var key in obj){
   allOfTheKeys.push(key);
   for(var i=0; i< obj[key].length; i++)
      nonRepeatedElems[obj[key][i]] = true;
}
for(var e in nonRepeatedElems )
   allOfTheArrays.push(e);

Если кому-то интересно, что такое nonRepeatedElems, это хеш-таблица для значений массива, ключ которой - значение элемента массива. Поэтому я не получаю повторяющихся элементов.

Если вы хотите, чтобы ваши значения были упорядочены, просто позвоните allOfTheArrays.sort(); в конце.

РЕДАКТИРОВАТЬ : @float, здесь у вас есть более понятное решение:

var allOfTheKeys = [], allOfTheArrays = [];
for(var key in obj){
   allOfTheKeys.push(key);
   for(var i=0; i< obj[key].length; i++){
      var arrayElem = obj[key][i];
      if(!$.inArray(arrayElem, allOfTheArrays)) //Add to the array if it doesn't exist yet
         allOfTheArrays.push(arrayElem);
   }
}
...