【问题标题】:Get count of unique values of properties from JSON API response从 JSON API 响应中获取属性的唯一值计数
【发布时间】:2014-09-06 15:27:59
【问题描述】:

我有一个由 Ruby on Rails 后端提供的 JSON API。其中一个端点返回一个结构如下的对象数组

{
  "title_slug": "16-gaijin-games-bittrip-beat-linux-tar-gz",
  "platform": "Linux",
  "format": ".tar.gz",
  "title": "BIT.TRIP BEAT",
  "bundle": "Humble Bundle for Android 3",
  "unique_games": 9
},
{
  "title_slug": "17-gaijin-games-bittrip-beat-linux-deb",
  "platform": "Linux",
  "format": ".deb",
  "title": "BIT.TRIP BEAT",
  "bundle": "Humble Bundle for Android 3",
  "unique_games": 9
},

由于单个标题有不同类型的下载,因此“标题”在多个对象中并不是唯一的。我只想计算唯一的标题。

我正在考虑在模型中的 Ruby on Rails 中执行此操作,然后在 JSON 响应中发送它,但这不起作用,因为它显然需要整个数组来计算它们。我在前端使用角度,所以我认为它需要在控制器中完成。我还在表格中过滤了响应,并希望显示更新的唯一标题数量。

这是一个页面的屏幕截图,这是为了获得更好的视角。 http://i.imgur.com/Iu1Xajf.png

非常感谢,

托马斯·勒

顺便说一句,这是我正在开发的网站,不会成为公共网站。这是一个数据库站点,包含我从IndieGalaHumbleBundle 购买的捆绑包的所有数据。我不会向公众提供这些链接。我让它比最低限度的功能更实用,因为它是我在 GitHub 上的一个开源项目,人们可以在本地使用它。

以防万一人们想知道为什么我在图片上列出了 Humble Bundle 的东西。

【问题讨论】:

  • 计数是微不足道的-> jsfiddle.net/215znzwt,至于如何实现,我想你得自己想办法了?
  • 我知道这很容易,但由于某种原因,我想不出该怎么做。谢谢。

标签: javascript ruby-on-rails ruby json angularjs


【解决方案1】:

http://jsfiddle.net/hy7rasp4/

将您的数据聚合到一个由唯一键索引的数组中,然后您可以访问有关重复和计数的信息。

var i,
    title,
    uniqueResults= {};

for (i in results) {
   title= results[i].title;
   if (!uniqueResults[title]) {
      uniqueResults[title]= [];
   }

   uniqueResults[title].push(results[i]);
}

【讨论】:

  • 两种解决方案几乎相同,但我最终使用了这个,所以我将这个标记为选择的答案。我在 if 语句中添加了一个计数来获取唯一名称的计数。我试着做一个uniqueResults.length.count,但它并没有像我想象的那样工作。
  • @thomasle 这是因为 uniqueResults 是一个对象而不是数组。要获取对象中的键数,您可以尝试使用 Object.keys(uniqueResults).length。但如果您希望支持所有浏览器请小心,因为不能保证此方法适用于所有浏览器。你可以在这里找到更多细节developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 谢谢。我不担心交叉兼容性,因为它是一个本地站点,我几乎只使用 chrome :)
【解决方案2】:

也许同时重构您的数据会更好,这样您以后也可以轻松获取这些项目以及快速查找标题数量,例如在 JavaScript

// assuming arrayOfObjects

var objectOfTitles = {},
    i;
for (i = 0; i < arrayOfObjects.length; ++i) {
    if (!objectOfTitles.hasOwnProperty(arrayOfObjects[i].title)) {
        objectOfTitles[arrayOfObjects[i].title] = [];
    }
    objectOfTitles[arrayOfObjects[i].title].push(arrayOfObjects[i]);
}

var numberOfTitles = Object.keys(objectOfTitles).length;
// then say you choose a title you want, and you can do
// objectOfTitles[chosenTitle] to get entries with just that title

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多