JSON - return 列表中具有特定键值的项目数

JSON - return number of items within a list that have a specific key value

试图解决这个 JSON 问题有点像噩梦。我需要将报价的数量存储为计数,但它只需要是报价具有激活状态的数字。在下面的示例中(为便于说明而简化),结果应为 2(因为对于 'activated' 键,只有其中一个为假)。我试图以此为目标:

var count = Object.keys(object.allOffers[0].offers[0].activated.hasOwnProperty('true')).length;

^^^ 但它 returns 0。此外,它只选择第一个报价,我需要一种方法来定位 allOffers 中的所有报价。有任何想法吗?下面的示例代码。

object {
  "allOffers": [
    {
      "offers": [
        {
          "offerId": 15661,
          "activated": true,
          "viewed": false
        },
        {
          "offerId": 15641,
          "activated": false,
          "viewed": false
        },
        {
          "offerId": 16461,
          "activated": true,
          "viewed": true
        }
      ]
    }
  ]
}

你的 .offers[0] 只针对数组中的第一个元素,检查 .activated 字符串是否有自己的 属性 of 'true' 没有任何意义.

最好的方法是改用 .reduce - 遍历数组,并为每个 obj.activated 为真的对象向累加器加一。

const input = {
  "allOffers": [
    {
      "offers": [
        {
          "offerId": 15661,
          "activated": true,
          "viewed": false
        },
        {
          "offerId": 15641,
          "activated": false,
          "viewed": false
        },
        {
          "offerId": 16461,
          "activated": true,
          "viewed": true
        }
      ]
    }
  ]
};

const totalActivated = input.allOffers[0].offers
  .reduce((a, obj) => a + obj.activated, 0);
console.log(totalActivated);

按激活的那些过滤然后检查结果数组的长度也有效。

const input = {
  "allOffers": [
    {
      "offers": [
        {
          "offerId": 15661,
          "activated": true,
          "viewed": false
        },
        {
          "offerId": 15641,
          "activated": false,
          "viewed": false
        },
        {
          "offerId": 16461,
          "activated": true,
          "viewed": true
        }
      ]
    }
  ]
};

const totalActivated = input.allOffers[0].offers
  .filter(obj => obj.activated)
  .length;
console.log(totalActivated);