2013-06-20 2 views
0

Дан массив из массива строк, как например:Создание дерева Javascript из массива строк

incoming = [["1","A","C","3"], 
      ["2","A","C","1"], 
      ["1","B","D","3"], 
      ["2","B","D","4"], 
      ["2","B","D","5"]]; 

Как превратить его в объект JSON как это:

[ 
    { "1": [ 
     { "A": [ 
       { "C": ["3"] 
       } 
       ] 
     }, 
     { "B": [ 
       { "D": ["3"] 
       } 
       ] 
     } 
     ] 
    }, 
    { "2": [ 
     { "A": [ 
       { "C": ["1"] 
       } 
       ] 
     }, 
     { "B": [ 
       { "D": ["4","5"] 
       } 
       ] 
     } 
     ] 
    } 
] 

I Мы рассмотрели несколько ответов на связанные вопросы, но не можем понять, как их сопоставить с этим конкретным требованием.

В PHP это было бы очень просто.

foreach (incoming AS inc) 
{ 
    output[inc[0]][inc[1]][inc[2]][inc[3]] = "x"; 
} 

Спасибо!

+0

вас PHP не будет работать так, как вы предполагаете, поскольку вы просто получите многомерный массив, а не массив объекта с вложенными массивами объектов. –

+0

^Но также нет ничего динамичного в этом решении PHP ... Наверное, это вопрос этого вопроса, иначе вы можете сделать то же самое в JS, если знаете, что всегда есть 4 элемента. – elclanrs

+0

Вы уверены, что структура данных вам подходит? Все ваши объекты имеют только одно свойство. Вы уверены, что хотите массивы объектов с одним свойством, а не объекты с несколькими свойствами, соответствующими строкам? – Barmar

ответ

0

Ваш вопрос сформулирован не очень хорошо. Может быть, вы хотите:

var incoming = [['1', 'A', 'C', '3'], ['2', 'A', 'C', '1'], ['1', 'B', 'D', '3'], ['2', 'B', 'D', '4'], ['2', 'B', 'D', '5']]; 
var obj = {}, propNames = ['prop1', 'prop2', 'prop3', 'prop4', 'prop5']; 
for(var i in incoming){ 
    obj[propNames[i]] = incoming[i]; 
} 

принять к сведению, однако, что вы не можете запустить for in.getElementsByTagName() петли или .getElementsByName() с более ранними версиями IE. Если ваш получать вашу информацию, основанную на том, что ваш код может выглядеть следующим образом:

var incoming = [['1', 'A', 'C', '3'], ['2', 'A', 'C', '1'], ['1', 'B', 'D', '3'], ['2', 'B', 'D', '4'], ['2', 'B', 'D', '5']]; 
var obj = {}, propNames = ['prop1', 'prop2', 'prop3', 'prop4', 'prop5']; 
for(var i=0,l=incoming.length; i>l; i++){ 
    obj[propNames[i]] = incoming[i]; 
} 

Обратите внимание, что arrayName[increment] или objectName[property] получает значение в JavaScript, эквивалентной переменной $value в РНР foreach($whatever as $value). Конечно, все, что я сделал, это назначить каждому массиву obj.prop1 и так далее. Это не создало бы структуру, которую вы показали. Это потребует, чтобы каждое свойство вашего JavaScript-объекта имело другое имя.

Чтобы воспроизвести нижний PHP код в JavaScript это может выглядеть следующим образом:

var output = {}; 
for(var i in incoming){ 
    var inc = incoming[i]; 
    output[inc[0]][inc[1]][inc[2]][inc[3]] = 'x'; 
} 

Обратите внимание, что мой последний фрагмент кода выше, и последний фрагмент не имеет смысла. Это не сработает на PHP или JavaScript.

+0

Я понял, что мой код не работает. Спасибо за помощь. Я переоценил свой код, поэтому я не использую этот стиль, но ваш ответ заставил меня думать в правильном направлении. – user2503284

0

разбить его на два этапа,

Шаг 1, преобразовать массив в объект дерево

var incoming = [["1","A","C","3"], ["2","A","C","1"], ["1","B","D","3"], 
       ["2","B","D","4"], ["2","B","D","5"]]; 

var i, j, o = {}, c, k; 

for (i = 0; i < incoming.length; ++i) { 
    c = o; 
    for (j = 0; j < incoming[i].length; ++j) { 
     k = incoming[i][j]; 
     if (!c[k]) c[k] = {}; 
     c = c[k]; 
    } 
} 

Теперь o выглядит то, что вы хотите, за исключением того, что не одел, как вы желание, поэтому требуется немного больше работы.
Шаг 2, повторно создать Object дерево по ключам => массивов, используя рекурсию

function recurseKeys(o) { 
    var arr = [], 
     k = Object.getOwnPropertyNames(o), 
     i, c; 
    for (i = 0; i < k.length; ++i) { 
     if (Object.getOwnPropertyNames(o[k[i]]).length) 
      c = {}, c[k[i]] = recurseKeys(o[k[i]]); 
     else 
      c = k[i]; 
     arr.push(c); 
    } 
    return arr; 
} 

o = recurseKeys(o); 

Теперь o должны иметь структуру, которую вы хотите, так что JSON-римента это

JSON.stringify(o); 
// "[{"1":[{"A":[{"C":["3"]}]},{"B":[{"D":["3"]}]}]},{"2":[{"A":[{"C":["1"]}]},{"B":[{"D":["4","5"]}]}]}]" 
Смежные вопросы