2016-03-08 2 views
3

Как я могу рекурсивно модифицировать вложенные объекты с помощью jQuery.map (или vanilla JS)?Как использовать jQuery.map для рекурсивного изменения вложенных объектов

// Original Object 
var data = [{ 
    name: 'Parent', 
    children: [{ 
     name: 'Child', 
     children: [{ 
      name: 'ChildChild' 
     }] 
    }] 
}]; 

// Resulting Object 
var data = [{ 
    name: 'Parent', 
    text: 'Parent', 
    children: [{ 
     name: 'Child', 
     text: 'Child', 
     children: [{ 
      name: 'ChildChild', 
      text: 'ChildChild' 
     }] 
    }] 
}]; 

В настоящее время я делаю это на верхнем уровне, используя jQuery.map, как это, но не знаю, как добиться этого рекурсивно.

$.map(data, function(obj){ 
    return $.extend(obj, {text: obj.name}); 
}); 

https://jsfiddle.net/minlare/0p0zb8vw/

ответ

4

Не используйте map() изменить массив; он предназначен для создания подмножества массива. Для изменения массива используйте each() или любой другой стандартный механизм циклирования.

Имея это в виду, вы можете использовать $.each() в этом случае для рекурсии объектов на каждом уровне массива. Попробуйте это:

function setText(arr) { 
    $.each(arr, function(i, obj) { 
     obj.text = obj.name; 
     if (obj.children && obj.children.length) { 
      setText(obj.children); 
     } 
    }); 
} 
setText(data); 

Updated fiddle

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