2015-02-02 4 views
0

Я пытаюсь преобразовать некоторые данные в объект javascript. Данные выглядит следующим образом:Массив преобразования вложенный объект

data = [["a","a","a","value1"], 
["a","a","b","value2"], 
["a","b","value3"], 
["a","c","a","value4"]] 

То, что я хочу, чтобы это:

a = { 
    "a":{ 
     "a":"value1", 
     "b":"value2" 
     }, 
    "b":"value3", 
    "c":{ 
     "a":"value4" 
    } 
} 

Поскольку сумма вложенных атрибутов меняется, я не знаю, как сделать это преобразование.

+0

Вы, скорее всего, не получите полного решения по вашему вопросу. Однако я решил бы это, используя рекурсию. Передайте часть данных функции, которая обрабатывает первую строку в массиве и передает остальную часть массива себе, пока не останется только одна строка. –

+0

Да, на самом деле это хорошая идея, я должен был придумать сам. Я попробую. – nik

ответ

3

Это должно быть функция, которую вы ищете:

function addItemToObject(dict, path){ 
    if (path.length == 2){ 
    dict[path[0]] = path[1]; 
    } else { 
    key = path.shift() 
    if (! dict[key]) { 
     dict[key] = {}; 
    } 
    addItemToObject(dict[key], path); 
    } 
    return dict; 
} 

var result = data.reduce(addItemToObject,{}); 

addItemToObject Функция является рекурсивной функцией, которая создает глубину и вставляет значение.

Это применяется ко всему в данных с использованием сокращения;

+0

Спасибо, это отлично работает :) – nik

-1

Я не получаю желаемого решения, так как в конечном объекте есть 4 блока данных, но только 3 свойства.

Однако это, как вы можете перебирать массив и его дочерних массивов:

var data = [["a","a","a","value1"], 
["a","a","b","value2"], 
["a","b","value3"], 
["a","c","a","value4"]]; 

//Store your results in here 
var result = {}; 

//Iterate each block of data in the initial array 
data.forEach(function(block){ 

    //block will refer to an array 

    //repeat with the child array 
    block.forEach(function(item){ 
     //item will point to an actual item in the child array 
    }); 

}); 

forEach() будет вызывать предоставленную функцию для каждого элемента в массиве.

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