Добавление нового списка в существующий объект java-скрипта

Я пытаюсь заполнить набор данных для гистограммы. Я хотел бы добавить «набор данных» к существующему объекту barData1.

Но я получаю следующую ошибку. Что я здесь делаю неправильно?

ошибка: jquery-3.1.1.min.js: 2 Uncaught TypeError: невозможно прочитать свойство «сращивание» неопределенного

<script type="text/javascript">
var jsprojStatList = @Html.Raw(ViewBag.projStatList);

    $(document).ready(function () {
        var barData1 = {
            labels: ["No. Of Line Items", "Line Items Ordered", "( % )", "Line Items to be Ordered", "( % )", "PO Generated", "PO Approved", "PO Waiting for Approval"]
        };
        //var obj = JSON.parse(barData1);
        //var parse_obj = JSON.parse(barData1);
        var i = 0;
        for (var key in jsprojStatList) {
            if (jsprojStatList.hasOwnProperty(key)) {
                var val = jsprojStatList[key];
                barData1['datasets'].splice(i, 0, {
                    "label": val.BudgetTypeTitle, "backgroundColor": "rgba(220, 220, 220, 0.5)", "rgba(220, 220, 220, 0.5)": "#fff"
                    , "data": [val.NoOfBudgetItems, val.NoOfBudgetItemsOrdered, val.NoOfBudgetItemsOrderedPercentage, val.NoOfBudgetItemsToBeOrdered
                        , val.NoOfBudgetItemsToBeOrderedPercentage, val.POGenerated, val.POApproved, (val.POGenerated - val.POApproved)]
                });
                i++;
                };
        };
        //}

        var barOptions1 = {
            responsive: true
        };

        var ctx21 = document.getElementById("barChart1").getContext("2d");
        new Chart(ctx21, { type: 'bar', data: barData1, options: barOptions1 
    });
</script>

person ecasper    schedule 24.02.2018    source источник


Ответы (1)


Вам нужно будет определить barData1['datasets'] как массив, прежде чем вы сможете добавлять к нему значения:

var barData1 = {
    datasets: [], // populated below
    labels: ["No. Of Line Items", "Line Items Ordered", "( % )", "Line Items to be Ordered", "( % )", "PO Generated", "PO Approved", "PO Waiting for Approval"]
};

.splice() не будет/не сможет автоматически создать массив для вас при первом использовании.


Боковые примечания:

  • Поскольку не похоже, что вы используете i для чего-либо еще, .push(value) можно использовать вместо .splice(i, 0, value). Это позволит вам отказаться от var i = 0 и i++.

  • Если jsprojStatList является Array (догадываясь от List в его имени), цикл for..in обычно не подходит для них.

person Jonathan Lonowski    schedule 24.02.2018