Рассчитать значения дочерних объектов и показать на родительском

0

Предположим, что это некоторые данные, которые я хочу опубликовать в своем представлении AngularJS (голландский язык):

    $scope.data =
    [
        {
            name: "actief",
            value: null,
            children:
            [
                {
                    name: "vast actief",
                    value: [20, 30, 40, 50],
                    children: null
                },
                {
                    name: "vlottend actief",
                    value: [215, 230, 245, 500],
                    children: null
                },
                {
                    name: "bewegend actief",
                    value: [134, 135, 136, 137],
                    children: null
                }
            ]
        },
        {
            name: "stilstaand",
            value: null,
            children:
            [
                {
                    name: "vast stilstaand",
                    value: [2000, 3000, 4000, 5000],
                    children: null
                },
                {
                    name: "vlottend stilstaand",
                    value: [2150, 2300, 2450, 5000],
                    children: null
                },
                {
                    name: "bewegend stilstaand",
                    value: [1340, 1350, 1360, 1370],
                    children: null
                }
            ]
        }
    ];

Чтобы опубликовать этот объект в списке на моем представлении, я могу сделать что-то вроде этого:

<ul ng-repeat="item in data">
    <li>{{item.name}}</li>
    <ul ng-repeat="child in item.children">
        <li>{{ child.name }}</li>
        <ul ng-repeat="value in child.value">
            <li>{{ value }}</li>
        </ul>
    </ul>
</ul>

Я хочу, чтобы у моего родительского объекта {{ item name }} был массив с суммой детей, например, у первого родителя был бы этот массив: [369, 395, 421, 687]

Я попытался сделать это вычисление внутри своего контроллера (я знаю, никакой логики в контроллере, но он просто для тестирования)

for (var i = 0; i < $scope.data.length; i++){
    $scope.data[i].value = [];
    for (var j = 0; j < $scope.data[i].children.length; j++) {
        if ($scope.data[i].children[j].value.length > 0) {
            for (var k = 0; k < $scope.data[i].children[j].value.length; k++) {
                console.log(typeof $scope.data[i].children[j].value[k]); // says number!
                $scope.data[i].value[k] += $scope.data[i].children[j].value[k]; // But my array is NAN???
            }
        }
    }
}

В моем родительском массиве есть 4 позиции, но среди них есть NaN, что я делаю неправильно?

Боковой вопрос:

потому что я делаю цикл, на мой взгляд, нет ли более короткого способа подсчета итогов позиции массива?

Теги:
arrays

1 ответ

0
Лучший ответ

Этот синтаксис

$scope.data[i].value[k] += ... // some value

предполагает, что уже есть значение в позиции k массива для увеличения.

В вашем коде массив изначально пуст. Что-то вроде этого:

var myArray = [];
myArray[0] += 1; // error: there is no element at the 0 position!

Одним из способов решения этой проблемы является инициализация пустого массива нулевыми значениями:

$scope.data[i].value = [0, 0, 0, 0]; // you can also seed the initial zeroes using a loop
  • 0
    Вы уверены, что? потому что, когда я делаю var myArray = []; myArray += 5 я просто получаю 5 . Но когда я делаю var myArray = []; myArray += 5; myArray += 10 я получаю 510 . То, что я вижу, - то, что это не считает числа, а согласовывает их.
  • 1
    Исходя из моего понимания вашего вопроса, вы хотите увеличить значение внутри массива с синтаксисом myArray[index] += value . Поэтому, если у вас есть var myArray = [1,2,3] и вы хотите добавить 5 к первому элементу, вы должны выполнить myArray[0] += 5 . Обратите внимание на использование индекса 0 . Синтаксис без индекса ( myArray += 5 ) - это не то, что вы ищете в этом случае.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню