#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']
, потому что оно не учитывает повторяющиеся значения, вот почему я проголосовал против вас. Почему вы проголосовали против меня? Мое решение возвращает именно то, что запрашивал float3. @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. Почему это отклонено? Возможно, это не лучшее решение, но оно определенно не является «бесполезным» или «неправильным».