比较两个JSON对象并使用javascript查找缺失值

时间:2016-09-23 22:22:49

标签: javascript json

我有两个JSON对象ctyIndemcountiesctyIndem对象包含美国各州的所有县,ctyIndem有县在该州支付的赔偿金,但不支付那些没有付款的县。我需要做的是迭代两个JSON,如果counties中缺少一个县,则添加var counties = [{ FIPS: 1001, County: "Autauga", State: "ALABAMA" }, { FIPS: 1003, County: "Baldwin", State: "ALABAMA" }, { FIPS: 1005, County: "Barbour", State: "ALABAMA" }, { FIPS: 1007, County: "Bibb", State: "ALABAMA" }, { FIPS: 1009, County: "Blount", State: "ALABAMA" }, { FIPS: 1011, County: "Bullock", State: "ALABAMA" }]; var ctyIndem = [{ Year: 2015, State: "ALABAMA", id: 1001, County: "Autauga", Indem: 50 }, { Year: 2015, State: "ALABAMA", id: 1003, County: "Baldwin", Indem: 200 }, { Year: 2015, State: "ALABAMA", id: 1005, County: "Barbour ", Indem: 1501 }]; counties.forEach(function(a, v) { if (a.FIPS == ctyIndem[v].id) { //County is present, then is ok console.log(ctyIndem[v].id); } else {//County not present, add new info var temp = []; temp.push({ Year: ctyIndem[0].Year, State: a.State, id: a.FIPS, County: a.County, Indem: 0 }); Array.prototype.push.apply(ctyIndem, temp); } }); console.log(ctyIndem); 中缺少的信息。

JS

Cluster.builder().addContactPoints("<cassandraip>")
        .withProtocolVersion(ProtocolVersion.V3)
        .build();

问题是当我遍历数组并且达到县FIPS和id不匹配时,我真的不知道该怎么做。我一直得到未捕获的TypeError:无法读取未定义错误的属性'id',因为显然没有匹配。 谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

在循环中,首先需要检查$scope.contactList = response.data;是否存在

ctyIndem[v]

答案 1 :(得分:1)

您的搜索逻辑错误。它仅检查ctyIndem中同一索引处的元素是否具有匹配的id。但是两个数组中的索引不匹配。你需要搜索整个数组。

执行此操作的一种简单方法是创建一个对象,其对象是您要搜索的ID。然后,您可以使用a.FIPS作为索引来查看它是否存在。

var ctyIds = {};
ctyIndem.forEach(function(c) {
    ctyIds[c.id] = true;
});

counties.forEach(function(a) {
    if (!ctyIds[a.FIPS]) {
        ctyIndem.push({
            Year: ctyIndem[0].Year,
            State: a.State,
            id: a.FIPS,
            County: a.County,
            Indem: 0
        });
    }
});

答案 2 :(得分:1)

首先使用ctyIndem中的id创建一个平面数组。使用Array.filter方法,您可以生成id列表中缺少的县数组。然后为每个缺少的县推入一个新对象:

    var indemIds = ctyIndem.map(function (c) { return c.id });

    var missingFromIndem = counties.filter(function (cnty) {
      return indemIds.indexOf(cnty.FIPS) === -1;
    });

    missingFromIndem.forEach(function (cnty) {
      ctyIndem.push({
        id: cnty.FIPS,
        State: cnty.State,
        County: cnty.County
      });
    });