【问题标题】:Get data from object child if it contains a certain string (JavaScript)如果对象子对象包含某个字符串(JavaScript),则从对象子对象获取数据
【发布时间】:2019-12-31 17:22:44
【问题描述】:

我从一个 API(使用 JavaScript,API 是 alphavantage.co)获取一些数据来获得一年的股票股息。 API 每月给我分红。所以我需要做的是总结子对象的红利,如果它们包含“2019”。

API 如下所示:

"Monthly Adjusted Time Series": {
        "2019-12-31": {
            "1. open": "37.4800",
            "2. high": "39.4320",
            "3. low": "36.9050",
            "4. close": "38.9750",
            "5. adjusted close": "38.9750",
            "6. volume": "493073245",
            "7. dividend amount": "0.0000"
        },
        "2019-11-29": {
            "1. open": "38.9500",
            "2. high": "39.7000",
            "3. low": "36.4000",
            "4. close": "37.3800",
            "5. adjusted close": "37.3800",
            "6. volume": "605847809",
            "7. dividend amount": "0.0000"
        },
... And so on until year 2000

我知道我必须循环它,但我如何检查孩子是否包含 2019?所以它不循环其他年份?

【问题讨论】:

  • 你自己已经尝试过什么了吗?
  • 我尝试使用 forEach 循环,但我没有得到任何结果,因为我不知道如何写“如果孩子包含“2019”。所以我真的被卡住了
  • 但是您在此处粘贴的对象不完整。只需放置适当的大括号,让用户了解实际结构。

标签: javascript string loops


【解决方案1】:

您需要过滤掉不匹配的值,然后对结果进行归约。

Object.entries(monthlyAdjustedTimeSeries)
    // Remove items that don't contain 2019
    .filter(([k]) => k.includes("2019-"))
    // Get just the values
    .map(([_, v]) => parseFloat(v["7. dividend amount"]))
    // Sum
    .reduce((ac, v) => ac + v, 0);

【讨论】:

  • 谢谢,效果很好。只需将“monthlyAdjutedTimeSeries”更改为 data['Monthly Adjusted Time Series']
  • 您好,代码运行良好,但有一件事我不明白。也许这是一个愚蠢的问题,但我正在努力学习。下划线在 map 函数中有什么作用?这部分:.map(([_, v])
  • 下划线只是一个没有被使用的变量名。使用下划线开始变量名或创建整个变量名会从大多数 linter 中删除未使用的变量警告。
【解决方案2】:

假设你得到了包含不同年份的其他子对象的主对象。

    const data = {
            "2019-12-31": {
                "1. open": "37.4800",
                "2. high": "39.4320",
                "3. low": "36.9050",
                "4. close": "38.9750",
                "5. adjusted close": "38.9750",
                "6. volume": "493073245",
                "7. dividend amount": "0.0000"
            },
            "2019-11-29": {
                "1. open": "38.9500",
                "2. high": "39.7000",
                "3. low": "36.4000",
                "4. close": "37.3800",
                "5. adjusted close": "37.3800",
                "6. volume": "605847809",
                "7. dividend amount": "0.1000"
            }
            
       };
       
       const output = Object.keys(data).reduce((sum, key) => {
          if (key.indexOf('2019') > -1) {
            return sum + Number(data[key]['7. dividend amount']);
          }
          return sum;
       }, 0);
       
       console.log(output);

【讨论】:

    【解决方案3】:

    您可以使用 for...in 循环和 RegExp.prototype.test()

    var data = [];
    for(let e in obj["Monthly Adjusted Time Series"]) {
      if(/2019/.test(e)) {
        data.push(obj["Monthly Adjusted Time Series"][e]);
      }
    }
    console.log(data);
    

    【讨论】:

      【解决方案4】:

      试试这样的

      Object.entries(obj).reduce((total, [key,])=>{
      if(/2019/.test(key)) {
      return total + +obj[key]["7. dividend amount"]
      }},0);
      

      【讨论】:

        猜你喜欢
        • 2018-06-14
        • 2021-12-19
        • 1970-01-01
        • 2022-12-15
        • 1970-01-01
        • 2012-09-16
        • 2021-08-15
        • 2020-06-01
        • 1970-01-01
        相关资源
        最近更新 更多