清理数据时Javascript数组对象潜在的数据结构问题

时间:2015-12-19 16:51:28

标签: javascript arrays regex for-loop dictionary

我正在尝试使用Javascript清理从文本文件解析的对象数组。通过SO的帮助,我的Google-fu和长时间的修补,我能够删除所有空值,从金额值中删除多余的字符,从金额和描述值中修剪额外的空格,并转换金额值为整数。所有这些都可以在下面的Plunker链接中正常工作。

var transferArray = [{
    "transferCode": [
      "23100"
    ],
    "details": [
      {
        "voucherNumber": [
          "0000047381",
          "0000047427",
          "0000047480",
          "0000047494",
          "0000047508",
          "0000047516",
          "0000047597",
          "0000047608",
          "0000047631",
          "0000047646",
          "0000047670",
          "0000047675",
          "0000047695"
        ],
        "vendor": [
          "Central Equatoria State",
          "EASTERN EQUATORIA ST",
          "JONGLEI STATE",
          "Lakes State",
          "Northern Bahr-el State",
          "Unity State",
          "Northern Bahr-el State",
          "Western E State",
          "Warap State",
          "Greater Pibor Admin.Area",
          "Upper Nile State",
          "Western BG State"
        ],
        "description": [
          "1003-1500 Block Grant Oct                  ",
          "1003-1501 Block Grant Oct                  ",
          "1003-1503 Block Grant Oct                  ",
          "1003-1504 Block Grant Oct                  ",
          "1003-1505 Block Grant Oct                  ",
          "1003-1506 Block Grant Oct                  ",
          "1003-1505 Block Grant Oct                  ",
          "1003-1508 Block Grant Oct                  ",
          "1003-1511 Block Grant Oct                  ",
          "1003-0926 Block Grant Sep                  ",
          "1003-1507 Block Grant Oct                  ",
          "1003-1509 Block Grant Oct                  3,178,342.00\"\r            "
        ],
        "amount": [
          "t                  6,027,922.00",
          "t                  5,510,965.00",
          "t                  5,280,181.00",
          "t                  4,814,009.00",
          "t                  3,826,046.00",
          "t                  4,672,368.00",
          "t                  1,200,000.00",
          "t                   4,509,358.00",
          "t                  5,547,404.00",
          "t                  2,462,988.00",
          "p                  3,067,645.00",
          "t                  5,663,401.00",
          "t                  3,178,342.00"
        ]
      }
    ]
  },
  {
    "transferCode": [
      "23201"
    ],
    "details": [
      {
        "voucherNumber": [
          "0000047585",
          "0000047589",
          "0000047601",
          "0000047602",
          "0000047604",
          "0000047674",
          "0000047690",
          "0000047697",
          "0000047725"
        ],
        "vendor": [
          "Central Equatoria State",
          "EASTERN EQUATORIA ST",
          "Northern Bahr-el State",
          "Unity State",
          "JONGLEI STATE",
          "Western E State",
          "Warap State",
          "Upper Nile State",
          "Western BG State"
        ],
        "description": [
          "1003-1552 Sal Tax Adj Gran Sep             ",
          "1003-1553 Sal Tax Adj Gran Sep             ",
          "1003-0048 Sal Tax Adj Gran Jul               ",
          "1003-1557 Sal Tax Adj Gran Sep               ",
          "1003-1554 Sal Tax Adj Gran Sep             ",
          "1003-1561 Sal Tax Adj Gran Sep               ",
          "1003-1559 Sal Tax Adj Gran Sep             ",
          "1003-1558 Sal Tax Adj Gran Oct             ",
          "1003-1560 Sal Tax Adj Gran Sep             1,375,683.00\"\r            "
        ],
        "amount": [
          "p             9,039,784.00",
          "p             3,774,442.00",
          "l               741,962.00",
          "p               890,633.00",
          "p             3,968,445.00",
          "p               996,638.00",
          "p             1,779,481.00",
          "t             3,102,814.00",
          "p             1,375,683.00"
        ]
      }
    ]
  }]

function removeNulls(obj) {
  var isArray = obj instanceof Array;
  for(var k in obj) {
    if(obj[k] === null) isArray ? obj.splice(k, 1) : delete obj[k];
    else if (typeof obj[k] === "object") removeNulls(obj[k]);
  }
}

removeNulls(transferArray);

console.log(JSON.stringify(transferArray, null, 2))

var cleanData = transferArray.map(function(e) {
                cleanData = e.details.map(function(evt, err) {
                    for(i = 0; i < evt.amount.length; i++) {
                        evt.amount[i] = evt.amount[i].toString();
                        evt.amount[i] = evt.amount[i].replace(/^[a-zA-Z]\s+/g, '');
                    evt.amount[i] = parseFloat(evt.amount[i].replace(/\,/g, ""));
                    }
                    for(i = 0; i < evt.description.length; i++) {
                    evt.description[i] = evt.description[i].toString();
                    evt.description[i] = evt.description[i].trim();
                    }
                    return(evt)
            })
            return(e)
            // console.log(evt.amount);
            // console.log(evt.description);
});

console.log(transferArray);

http://plnkr.co/edit/Fy1jlV7KdNhWoPqvw4ng?p=preview

不幸的是,当我尝试将其合并到我的代码中时,它具有相同结构的更大对象数组,但它不起作用。删除了null和undefined值,但cleanData函数似乎无法正常工作。

我怀疑我的数据结构实际上与Plunker不同,但我真的看不出差异。我在下面提供了截图:

screenshot of upload test

我很感激任何帮助或指导。我一直试图将这个问题包围了几天。

编辑:

我使用实际数据结构的示例更新了plunker和代码,因为它与我之前提供的示例略有不同。

1 个答案:

答案 0 :(得分:0)

这将清除null数量并将数字字符串转换为数字:

var transferArray = [{
   "transferCode": 8675309,
       "details": [
          {
            "voucherNumber": [34, 21],
            "vendor": ["stan", "kyle"],
            "description": ["blah      ", "blah blah        "],
            "amount": ["t        45,555.00", "p         34,456.00"]
          }
        ]
    },
    {
      "transferCode": 45576543,
      "details": [
          {
            "voucherNumber": [22, 57],
            "vendor": ["Johnson", "Tyler"],
            "description": ["trap music      ", "The Wiz"],
            "amount": [null, "r       77,564.00"]
          }
        ]
    }];

var clean = transferArray.map(function(transfer){
  transfer.details = transfer.details.map(function(detail){
    detail.amount = detail.amount.filter(function(quantity){
      if(quantity !== null){
        return true;
      }
    });
    detail.amount = detail.amount.map(function(quantity){
      var num = quantity.replace(/[^\d\.]+/g, '');
      return Number(num);
    });
    return detail;
  });
  return transfer;
});

document.getElementById('results').innerHTML = JSON.stringify(clean, null, '\t');
<pre id="results"></pre>