2014-09-25 3 views
4

Я пытаюсь достичь чего-то, что казалось очень простым, но в последние дни меня злишь.Гнездо JSON из массива

У меня есть простой массив: ["a","b","c","d","e"] и я хочу, чтобы превратить его в гнездовой JSON как это:

{"a":{"b":{"c":{"d":{"e":""}}}}} 

Looping над ним, я побежал в таких проблем, как «как вы сохраните последний ключ, чтобы установить это потом, не стирая его »и так далее.

У кого-нибудь есть идеи?

+1

Почему вы это делаете? Просто для удовольствия? –

+1

Как будет {"a": {"b": {"c": {"d": {"e": ""}}}}} помочь вам? – artm

+0

Мне нужно построить нефритовый блок из JSON, который я должен построить из массива;) – user3460988

ответ

4

Возможно, у вас были проблемы, потому что вы зацикливались в неправильном направлении. Попробуйте построить объект из наизнанку:

array.reduceRight(function(v, key) { 
    var o = {}; 
    o[key] = v; 
    return o; 
}, "") 

или с петлей:

var val = ""; 
for (var i=array.length; i--;) 
    var o = {}; 
    o[array[i]] = val; 
    val = o; 
} 
return val; 
+0

Просто то, что мне нужно! Никогда не слышал об этом методе reduceRight, очень полезен, спасибо! :) – user3460988

1

Вот один из способов сделать это, рекурсивно:

function convertToNestedObject(arr) { 
    var result = {}; 

    if (arr.length === 1) { 
     result[arr[0]] = ''; 
    } else { 
     result[arr[0]] = convertToNestedObject(arr.slice(1, arr.length)); 
    } 

    return result; 
} 

Вы могли бы передать введите индекс в функцию вместо использования slice и создайте копии массива:

function convertToNestedObject(arr, startIndex) { 
    var result = {}; 


    if (arr.length - startIndex === 1) { 
     result[arr[startIndex]] = ''; 
    } else { 
     result[arr[startIndex]] = convertToNestedObject(arr, startIndex + 1); 
    } 

    return result; 
} 

Пример:http://jsfiddle.net/jwcxfaeb/1/

+0

Вы должны сделать базовый регистр для 'arr.length == 0' – Bergi

+0

@Bergi: Не уверен в этом, если' arr.length' '0', то доступ к элементу в' arr [0] 'будет return 'undefined'. Если вы не хотите полностью изменить базовый случай –

+0

Да, я имею в виду полностью изменить базовый корпус, чтобы вообще не было похожего на рекурсивный случай - упрощение всей функции. – Bergi

0

Поместите текущий элемент в качестве ключа и пустой объект ({}) в качестве значения. Продолжайте вводить пустой объект.

function toNested(arr){ 
    var nested = {}; 
    var temp = nested; 

    for(var i=0; i<arr.length; i++){ 
     temp[arr[i]] = {}; 
     temp = temp[arr[i]]; 
    } 

    return nested; 
} 
Смежные вопросы