Как мне перенести ключи из объекта в массив?

#javascript #jquery #arrays #object #node.js

#javascript #jquery #массивы #объект #node.js

Вопрос:

Предположим, у меня есть следующий объект 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']
  

Комментарии:

1. Я опубликовал проверенное правильное решение

2. не уверен, правильно ли это, но в итоге я использовал for(var k in obj){ allOfTheKeys.push(k); for (var i = 0; i < obj[k].length; i ){ if (allOfTheArrays.indexOf(obj[k][i]) == -1){ allOfTheArrays.push(obj[k][i]); } } }

Ответ №1:

Что-то вроде

 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. @Charlie То, что я в итоге использовал, было основано на вашем решении. for(var k in obj){allOfTheKeys.push(k);for (var i = 0; i < obj[k].length; i ){if (allOfTheArrays.indexOf(obj[k][i]) == -1){allOfTheArrays.push(obj[k][i]);}}} Я не уверен, что я просто неправильно реализовал вашу короткую руку, но allElem возвращался: _atomics,validators,_path,_parent,_schema,_cast,_markModified,_registerAtomic,doAtomics,push,$push,nonAtomicPush,$pushAll,$pop,$shift,remove,$pull,pull,$pullAll,toObject,0,1,_atomics,validators,_path,_parent,_schema,_cast,_markModified,_registerAtomic,doAtomics,push,$push... etc

2. @Charlie, ваше решение возвращает ['1','2','3','1','2','9','1','3','5'] , потому что оно не учитывает повторяющиеся значения, вот почему я проголосовал против вас. Почему вы проголосовали против меня? Мое решение возвращает именно то, что запрашивал float

3. @Charlie. Давайте перестанем ругаться, как дети, хехехе. Приветствия 🙂

4. @Edgar, ваше решение использует три цикла вместо двух, упускает шанс использовать for..in цикл, который безопаснее и часто быстрее, и зависит от построения массива флагов, чтобы делать то, что вы могли бы делать в строке. Это слишком сложно и медленно. И обратите внимание, что у вас возник спор с самим собой — три комментария?

Ответ №2:

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

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

Комментарии:

1. Эй, извините, я вроде как новичок в этом, в итоге я сделал: for(var k in obj){ allOfTheKeys.push(k); for (var i = 0; i < obj[k].length; i ){ if (allOfTheArrays.indexOf(obj[k][i]) == -1){ allOfTheArrays.push(obj[k][i]); } } } Можете ли вы дать мне краткий обзор того, что делает эта часть вашего кода: for(var i=0; i< obj[key].length; i ) nonRepeatedElems[obj[key][i]] = true; и for(var e in nonRepeatedElems ) allOfTheArrays.push(parseInt(e, 10)); я предполагаю, что это лучшее решение, чем мое, но я не совсем понимаю это. Спасибо!

2. Это действительно просто чрезвычайно сложно, вы не находите?

3. @Charlie, просто предложи более простое решение, которое работает , и я тебе поверю. Почему вы голосуете против, если мое решение правильное?

4. @float, я добавляю объяснение к решению. Приветствия

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