Javascript-计算重复的JSON值,并将Count与关联键一起排序



可能重复:
按属性值对JavaScript对象进行排序

我想获得JSON中某个值的最高结果。更容易解释的例子:

var jsonData = {
  bom: [
        {
            "Component":"Some Thing",
            "Version":"Version ABC",
            "License":"License ABC",
        },
        {
            "Component":"Another Thing",
            "Version":"Version XYZ",
            "License":"License ABC",
        }, 
        etc ....
       ]
}

因此,我的目标是确定"许可证ABC"或其他许可证有X次出现,然后我希望能够将这些密钥:val对排序为"最受欢迎的X个许可证是:

  • 许可证ABC-100
  • 许可XYZ-70
  • 许可证123-25

现在我有这个:

var countResults = function() {
    var fileLicenses = [];
    for ( var i = 0, arrLen = jsonData.files.length; i < arrLen; ++i ) {
        fileLicenses.push(jsonData.files[i]["License"]);
    }
    keyCount = {};
    for(i = 0; i < fileLicenses.length; ++i) {
        if(!keyCount[fileLicenses[i]]) {
            keyCount[fileLicenses[i]] = 0;
        }
        ++keyCount[fileLicenses[i]];
    }
    console.log( keyCount );
}();

哪个得到了我想要的东西,一个带有关键字的对象:values

{
    thisKey : 78,
    thatKey :125,
    another key : 200,
    another key : 272,
    another key : 45,
    etc ...
}

但我不知道该怎么办。我只需要对右边的数字列进行排序,并让相关的键在旅途中保持不变。想法?非常感谢。

不能根据对象的值对其进行排序。您可以做的是将其转换为一个对象数组,然后对其进行排序。类似于:

var rank = function(items, prop) {
  //declare a key->count table
  var results = {}
  //loop through all the items we were given to rank
  for(var i=0;len=items.length;i<len;i++) {
    //get the requested property value (example: License)
    var value = items[i][prop];
    //increment counter for this value (starting at 1)
    var count = (results[value] || 0) + 1;
    results[value] = count;
  }
  var ranked = []
  //loop through all the keys in the results object
  for(var key in results) {
    //here we check that the results object *actually* has
    //the key. because of prototypal inheritance in javascript there's
    //a chance that someone has modified the Object class prototype
    //with some extra properties. We don't want to include them in the
    //ranking, so we check the object has it's *own* property.
    if(results.hasOwnProperty(key)) {
      //add an object that looks like {value:"License ABC", count: 2} 
      //to the output array
      ranked.push({value:key, count:results[key]}); 
    }
  }
  //sort by count descending
  return ranked.sort(function(a, b) { return b.count - a.count; });
}

用法:

var sorted = rank(jsonData.bom, "License");
var first = sorted[0].value;

/代码未测试

最新更新