【问题标题】:Build array based on JSON api response基于 JSON api 响应构建数组
【发布时间】:2020-04-07 11:57:34
【问题描述】:

下面是 angularjs 中 api 的 JSON 响应,

{
"counts": 
[
  [
    {
      "xcount": 0.0,
      "ycount": 0.0,
      "month": 4

    },
    {
      "xcount": 0.0,
      "ycount": 0.0,
      "month": 5

    },
    {
      "xcount": 0.0,
      "ycount": 2.85,
      "month": 6
    },
    {
      "xcount": 8.85,
      "ycount": 0.0,
      "month": 6
    },
    {
      "xcount": 10.17,
      "ycount": 0.0,
      "month": 7
    },
    {
      "xcount": 0.0,
      "ycount": 2.85,
      "month": 7
    },
    {
      "xcount": 12.0,
      "ycount": 0.0,
      "month": 8
    },
    {
      "xcount": 0.0,
      "ycount": 2.85,
      "month": 8
    },
    {
      "xcount": 0.0,
      "ycount": 2.85,
      "month": 9
    },
    {
      "xcount": 11.0,
      "ycount": 0.0,
      "month": 9
    }
  ]
]
}

根据我的要求,我希望得到如下响应

{
"counts": 
[
  [
    {
      "xcount": 0.0,
      "ycount": 0.0,
      "month": 4

    },
    {
      "xcount": 0.0,
      "ycount": 0.0,
      "month": 5

    },
    {
      "xcount": 8.85,
      "ycount": 2.85,
      "month": 6
    },

    {
      "xcount": 10.17,
      "ycount": 2.85,
      "month": 7
    },
    {
      "xcount": 12.0,
      "ycount": 2.85,
      "month": 8
    },
    {
      "xcount": 11.0,
      "ycount": 2.85,
      "month": 9
    }
  ]
]

}

【问题讨论】:

  • 两者有什么区别?
  • Original 有两个相同月份的条目我想合并,我现在无法更改为 api。所以必须在 UI 方面处理。
  • 这看起来像是一个“为我做”的问题。您能否添加您尝试过的内容,并进一步详细说明您需要什么。即我想删除重复的月份。您需要添加这些详细信息以使问题更具可读性和可回答性。
  • 它不仅仅是删除重复项!它结合了相同的键(月)元素​​。我试图在后端使用反射解决它但无法得到任何解决方案,所以现在我正在尝试在 UI 端。
  • 所以想法是删除具有重复日期的对象?

标签: javascript arrays angularjs


【解决方案1】:

var arr = {
  "counts": [
    [{
        "xcount": 0.0,
        "ycount": 0.0,
        "month": 4

      },
      {
        "xcount": 0.0,
        "ycount": 0.0,
        "month": 5

      },
      {
        "xcount": 0.0,
        "ycount": 2.85,
        "month": 6
      },
      {
        "xcount": 8.85,
        "ycount": 0.0,
        "month": 6
      },
      {
        "xcount": 10.17,
        "ycount": 0.0,
        "month": 7
      },
      {
        "xcount": 0.0,
        "ycount": 2.85,
        "month": 7
      },
      {
        "xcount": 12.0,
        "ycount": 0.0,
        "month": 8
      },
      {
        "xcount": 0.0,
        "ycount": 2.85,
        "month": 8
      },
      {
        "xcount": 0.0,
        "ycount": 2.85,
        "month": 9
      },
      {
        "xcount": 11.0,
        "ycount": 0.0,
        "month": 9
      }
    ]
  ]
}

arr.counts[0] = arr.counts[0].reduce((acc, cv, i, arr) => {
  if (!acc[cv.month]) {
    acc[cv.month] = cv;
  } else {
    acc[cv.month].xcount += cv.xcount
    acc[cv.month].ycount += cv.ycount
  }
  if (i === arr.length - 1) {
    return Object.keys(acc).map(key => acc[key])
  } else {
    return acc;
  }
}, {});

console.log(arr.counts[0]);

使用reduce 函数,我们使用月份号作为键创建一个临时对象。这使我们能够跟踪唯一条目。当我们找到重复的月份时,我们将xcountycount 加在一起。一旦我们到达列表的末尾,我们就会返回映射到它们的值的临时对象的键。生成一个仅包含唯一月份的列表。

【讨论】:

    【解决方案2】:

    正如我从您的问题中了解到的那样,删除重复的月份,如果是这种情况,这是我上面的建议。


    更新:了解您关于按 xcount、ycount 组合的观点,并添加了必要的更改。

    var arr = {
        "counts": [
          [
            {
              "month": 4,
              "xcount": 0,
              "ycount": 0
            },
            {
              "month": 5,
              "xcount": 0,
              "ycount": 0
            },
            {
              "month": 6,
              "xcount": 0,
              "ycount": 2.85
            },
            {
              "month": 6,
              "xcount": 8.85,
              "ycount": 0
            },
            {
              "month": 7,
              "xcount": 10.17,
              "ycount": 0
            },
            {
              "month": 7,
              "xcount": 0,
              "ycount": 2.85
            },
            {
              "month": 8,
              "xcount": 12,
              "ycount": 0
            },
            {
              "month": 8,
              "xcount": 0,
              "ycount": 2.85
            },
            {
              "month": 9,
              "xcount": 0,
              "ycount": 2.85
            },
            {
              "month": 9,
              "xcount": 11,
              "ycount": 0
            }
          ]
        ]
      };
      var tmpMonths = [];
      var tmpObjects = {};
      var results = [];
      for (var i=0;i<arr.counts[0].length;i++) {
          var obj = arr.counts[0][i];
          var key = "month_" + obj.month;
          if (obj.month && tmpMonths.indexOf(obj.month)===-1) {
              
              tmpMonths.push(obj.month);
              tmpObjects[key] = obj;
              results.push(obj);
          } else {
              tmpObjects[key] = {
                  month: obj.month,
                  xcount: obj.xcount + tmpObjects[key]["xcount"],
                  ycount: obj.ycount + tmpObjects[key]["ycount"],
              };
          }
      }
      arr.counts[0] = Object.values(tmpObjects);
      console.log(JSON.stringify(arr));

    【讨论】:

    • 并且还想合并 xcount ycount 个重复项!
    • 您的意思是结合 xcount 和 ycoundt 的总和(+ 运算符)?
    • 点赞{ "xcount": 8.85, "ycount": 2.85, "month": 6 }
    • 值需要合并而不需要求和。
    • 查找更新后的代码,如果能满足您的需求,请告诉我?
    猜你喜欢
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2021-08-02
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    相关资源
    最近更新 更多