计算并显示JSON数组中的值

时间:2014-08-25 08:08:57

标签: javascript arrays json sorting

我有一些看起来像这样的数据:

{
  "data": [
    {
       "tags": [
           "design",
           "development",
           "code",
           "foo",
           "bar"
        ],
        "views": [
           "81"
        ]
        ...
    },
    {
       "tags": [
           "design",
           "foo",
           "photoshop",
           "alice",
           "bob"
         ],
        "views": [
           "28"
         ]
     ...
    }

我希望做的是遍历每个数据项,计算标签,然后显示每个数据项的出现次数。不过,我不想手动查询每个标签。

理想情况下,我希望它显示如下:

foo: 2
design: 2
alice: 1 

等等。最终,我希望使用Highcharts,Amcharts或类似的东西将它合并到图表中?

我最接近的是这个,取自本网站上的另一个解决方案(这并没有创建一个完整的显示,但我首先试图掌握自己计算值,以任何可能的方式) :

$.getJSON('myarray.json', function(data) {

var occurrences = 0;
for (var i = 0; i < data.data.length; i++) {
  if (data.data[i].tags == "foo") {
    occurrences++;
  }
}

console.log(occurrences);

});

但是这个输出不正确。任何帮助都将不胜感激。再一次,我想查看每个数据集的标记,并输出每个数据集发生次数的计数(理想情况下按降序排列)。

5 个答案:

答案 0 :(得分:0)

if (data.data[i].tags.indexOf("foo") != -1)

答案 1 :(得分:0)

您正确遍历每个项目,但您忘记了每个项目中的“标签”也是项目列表。

$.getJSON('myarray.json', function(data) {

  var tagcount = {};
  for (var i = 0; i < data.data.length; i++) {
    var item = data.data[i];
    if( item.tags != undefined ) {
      for (var j = 0; j < item.tags.length; j++) {
        var tag = item.tags[j];
        if( tagcount[tag] == undefined ) {
          tagcount[tag] = 1;
        } else {
          tagcount[tag]++;
        }
      }
    }
  }

  console.log(tagcount);

});

答案 2 :(得分:0)

您可以通过迭代数据获得所需的结果,我已经将您的数据作为示例:

var data = {
    "data": [{
        "tags": [
            "design",
            "development",
            "code",
            "foo",
            "bar"],
           "views": [
            "81"]
    }, {
        "tags": [
            "design",
            "foo",
            "photoshop",
            "alice",
            "bob"],
            "views": [
            "28"]

    }]
};

然后我们可以像这样迭代它:

var countArray = [];
$.each(data.data, function(dataKey, dataValue) {
    $.each(dataValue.tags, function(tagKey, tagValue) {
        if( !(tagValue in countArray) ) {
            countArray[tagValue] = 1;    
        } else {
            countArray[tagValue]++;
        }
    });
});

将输出控制台日志

console.log(countArray);

[design: 2, development: 1, code: 1, foo: 2, bar: 1…]

jsFiddle:http://jsfiddle.net/602puhja/

答案 3 :(得分:0)

var result = {};

for(var i = 0; i < data.length; i++){
    for(var j = 0; j < data[i].tags.length; j++){

        var prop = data[i].tags[j];        
        result[prop] = !result[prop] ? 1 : result[prop] + 1;
    }
}

console.log(result);
// Object {design: 2, development: 1, code: 1, foo: 2, bar: 1…}

http://jsfiddle.net/v0rhxvff/

答案 4 :(得分:0)

您必须使用字典计算所有出现次数,然后将其滚动到数组中并对其进行排序(如果您想要与输出结果相同:

// this will count per string each occurrence
var occurrencies = {};

function fetchAndSort(data) {

  var i,j;

  for (i = 0; i < data.data.length; i++) {
    var tags = data.data[i].tags;
    // now iterate inside tags
    for( j=0; j < tags.length; j++){
      // if there's not yet an entry in the dictionary, just create it
      if(!occurrencies[tags[j]]){
        occurrencies[tags[j]] = 0;
      }
      occurrencies[tags[j]]++;
    }
  }

  // at this point there's an object with all the keys and the relative count
  // if you want an ordered list you have to use an array because iterate on object
  // keys in JS [doesn't guarantee any order][1]
  var array = [];
  for( i in occurrencies ){
    array.push({name: i, count: occurrencies[i]});
  }

 // now sort it
 array.sort(function(entry1, entry2){
    // sort the array descending
    return entry2.count - entry1.count;
 });

 for( i = 0; i<array.length; i++){
   console.log(array[i].name + ':' + array.count);
 }

};

$.getJSON('myarray.json', fetchAndSort);

由于解释目的,解决方案有点长。您可以通过缩短一些位来实现并优化您的需求。