无法读取未定义的属性“键”

时间:2019-08-14 04:18:25

标签: javascript

我有几个对象,我想创建一个“映射”数组来存储带有一个字段键的对象作为一个数组,该数组将具有两个输入和一个值字段。值字段将是每个具有相同“键”属性的地图的总和。我尝试了一些解决方案,但没有成功。

var myJSON = [{
  TimeCheck : '201908',
  service : null,
  TotalAmount : 0
},
{
  TimeCheck : '201907',
  service : 'License',
  TotalAmount : 5000000
},
{
  TimeCheck : '201908',
  service : 'License',
  TotalAmount : 5000000
},
{
  TimeCheck : '201908',
  service : 'Package',
  TotalAmount : 1200000
},
{
  TimeCheck : '201908',
  service : 'Package',
  TotalAmount : 3000000
}]

var labels = [], dataPackage = [], dataLisence = [];
var TotalAmountP = 0;
var TotalAmountL = 0;
var map = [{ key : ['Service','TimeCheck'], value : 0 }];

for (var i = 0; i < myJSON.length; i++) {

    if (labels.indexOf(myJSON[i].TimeCheck.substr(0, 4) + '/' + myJSON[i].TimeCheck.substr(4, 2)) == -1) {
        labels.push(myJSON[i].TimeCheck.substr(0, 4) + '/' + myJSON[i].TimeCheck.substr(4, 2));
        map[i].key[1] = myJSON[i].TimeCheck.substr(0, 4) + '/' + myJSON[i].TimeCheck.substr(4, 2);
    }

    if (myJSON[i].Service == "Package") {
        map[i].key[0] = myJSON[i].Service;

        for (var j = 0; j < map.length; j++) {
            if (map[i].key[0] !== map[j].key[0] && map[i].key[1] !== map[j].key[1]) {
                map[i].key[0] = myJSON[i].Service;
                map[i].value = myJSON[i].TotalAmount;
            } else {
                var newValue = map[j].value + myJSON[i].TotalAmount
                map[j].value = newValue;
            }
        }
    }

    else if (myJSON[i].Service == "License") {

        map[i].key[0] = myJSON[i].Service;

        for (var j = 0; j < map.length; j++) {
            if (map[i].key[0] !== map[j].key[0] && map[i].key[1] !== map[j].key[1]) {
                map[i].key[0] = myJSON[i].Service;
                map[i].value = myJSON[i].TotalAmount;
            } else {
                var newValue = map[j].value + myJSON[i].TotalAmount
                map[j].value = newValue;
            }
        }
    }
}

地图数组应具有两个值:

map[0] = {
key: ['Package','201907'],
value: 4200000}
map[1] = {
key: ['License','201907'],
value: 5000000}

以此类推。

3 个答案:

答案 0 :(得分:0)

您说map数组只有两个值:在您的代码中,它仅使用一个值(索引为0)初始化。但是您要使用变量public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // ... app.UseMiddleware<UserDataLoggingMiddleware>(); // ... app.UseMvc(); } 进行迭代,直到i的长度为止,其中有5个值。因此,当您访问myJSON并且map[i].keyi时,1是未定义的。

答案 1 :(得分:0)

您要在长度超过myJSON的{​​{1}}上进行迭代。因此,您将不会访问map,而从map[3]找不到key

检查以下解决方案。

undefined

答案 2 :(得分:0)

第一步是使地图数组结构的长度等于myJSON值5,那么只有您才能迭代地图数组。

var map = [];
for (var i = 0; i < myJSON.length; i++) {
  map.push({ key : ['service','TimeCheck'], value : 0 }); 
}

您在代码中犯的另一个错误是键名不是myJSON [i] .Service。 实际上是myJSON [i] .service 's'应该更小,键名不区分大小写

如果条件不知道在条件内添加相同内容的确切原因,我也删除了以下内容。您也可以根据需要进行选择。

map[i].key[1] = myJSON[i].TimeCheck.substr(0, 4) + '/' + myJSON[i].TimeCheck.substr(4, 2);

var myJSON = [{
  TimeCheck : '201908',
  service : null,
  TotalAmount : 0
},
{
  TimeCheck : '201907',
  service : 'License',
  TotalAmount : 5000000
},
{
  TimeCheck : '201908',
  service : 'License',
  TotalAmount : 5000000
},
{
  TimeCheck : '201908',
  service : 'Package',
  TotalAmount : 1200000
},
{
  TimeCheck : '201908',
  service : 'Package',
  TotalAmount : 3000000
}]


var labels = [], dataPackage = [], dataLisence = [];
var TotalAmountP = 0;
var TotalAmountL = 0;

var map = [];
for (var i = 0; i < myJSON.length; i++) {
  map.push({ key : ['service','TimeCheck'], value : 0 }); 
}

for (var i = 0; i < myJSON.length; i++) {

    if (labels.indexOf(myJSON[i].TimeCheck.substr(0, 4) + '/' + myJSON[i].TimeCheck.substr(4, 2)) == -1) {
        labels.push(myJSON[i].TimeCheck.substr(0, 4) + '/' + myJSON[i].TimeCheck.substr(4, 2));
        //map[i].key[1] = myJSON[i].TimeCheck.substr(0, 4) + '/' + myJSON[i].TimeCheck.substr(4, 2);
    }

    map[i].key[1] = myJSON[i].TimeCheck.substr(0, 4) + '/' + myJSON[i].TimeCheck.substr(4, 2);


    if (myJSON[i].service === "Package") {
        map[i].key[0] = myJSON[i].service;

        for (var j = 0; j < map.length; j++) {
            if (map[i].key[0] !== map[j].key[0] && map[i].key[1] !== map[j].key[1]) {
                map[i].key[0] = myJSON[i].service;
                map[i].value = myJSON[i].TotalAmount;
            } else {
                var newValue = map[j].value + myJSON[i].TotalAmount
                map[j].value = newValue;
            }
        }
    }

    else if (myJSON[i].service === "License") {

        map[i].key[0] = myJSON[i].service;

        for (var j = 0; j < map.length; j++) {
            if (map[i].key[0] !== map[j].key[0] && map[i].key[1] !== map[j].key[1]) {
                map[i].key[0] = myJSON[i].service;
                map[i].value = myJSON[i].TotalAmount;
            } else {
                var newValue = map[j].value + myJSON[i].TotalAmount
                map[j].value = newValue;
            }
        }
    }
}

console.log(map)