Я хочу найти элемент с некоторым id
в многоуровневом json-объекте. Я использую рекурсию с angular.forEach
методом. Но метод возвращает мне undefined
несмотря на это return value;
.
вот метод:
function findLaoutFieldByID(array, search) {
if (!array || !search) {
return null;
}
angular.forEach(array, function(value, key) {
if (value.id == search) {
return value;
}
return findLaoutFieldByID(value.items, search);
});
}
Может, кто-нибудь скажет мне, почему?
EDIT: Возможно, кто-то может предложить, как найти объект с id=rc2
в этом массиве, попробовал рекурсию, но не повезло.
$scope.containerLayout = [ {
id : 'root',
size : '100%',
direction : 'row',
items : [ {
id : 'rc1',
size : '50%',
direction : 'col',
items : [ {
id : 'rc11',
size : '40%'
}, {
id : 'rc12',
size : '40%'
}, {
id : 'rc13',
size : '20%'
} ]
}, {
id : 'rc2',
size : '50%'
} ]
} ];
Я нашел какое-то решение, не уверен, что это лучше, но кому-то еще нужно:
function findLaoutFieldByID(array, search) {
if (!array || !search) {
return null;
}
for (var i = 0; i < array.length; i++) {
if (array[i].id == search) {
return array[i];
}
var returns = 0;
if (array[i].items) {
while (returns != array[i].items.length) {
var val = findLaoutFieldByID(array[i].items, search);
if (val == null) {
returns++;
} else {
return val;
}
}
}
}
return null;
}
Вы возвращаетесь от функции, которая выполняет итерацию (угловая.forEach), а не из findLaoutFieldByID
. Вы можете использовать обычный for
цикла.
findLaoutFieldByID
.