簡體   English   中英

根據對象的屬性值(相對於其他元素中發生的次數)過濾數組

[英]Filter array based on an object's property value relative to how many times it occurs in other elements

所以說我有這個數組:

[
     {
        source:"A",
        country:"United States",
        region:"Illinois",
        city:"Chicago"
     },
     {
        source:"B",
        country:"United States",
        region:"Illinois",
        city:"Rock Falls"
     },
     {
        source:"C",
        country:"United States",
        region:"Illinois",
        city:"Sterling"
     },
     {
        source:"D",
        country:"United States",
        region:"Illinois",
        city:"Rock Falls"
     },
     {
        source:"E",
        country:"United States",
        region:"Illinois",
        city:"Rock Falls"
     }
  ]

我正在嘗試將某些IP“聚集到源”到位置數據,並且我有五個源,每個源都返回具有國家,地區,城市屬性的對象,當然源是該特定源。

在以下情況下,使用underscore.js選擇理想結果的最佳方法是什么:

  1. 如果有一個(城市,地區)對出現的次數比其他任何對都多,請選擇該對(和國家/地區屬性)。

  2. 如果不存在比其他對多的對,例如:(a,a,b,b,c),(a,b,c,d,e),則選擇來源E及其信息。

  3. 如果源E不存在並且沒有共同的對,請選擇一個隨機源。

  4. 如果只有一個來源,顯然要選擇它。

某些來源也可能不存在。

下划線是我的最愛。 這符合您的所有條件。 在傳遞零長度數組的情況下,它返回undefined,因為您沒有提到要在此處發生的事情。

var finder = function(arr){
  var fTable = _.chain(arr).groupBy(function(elem){
    return elem.region+elem.city+elem.country;
  }).sortBy("length").reverse().value();
  return (fTable[0] && fTable[1] && fTable[0].length > fTable[1].length && fTable[0][0])
      || _(arr).findWhere({source: 'E'}) || _(arr).shuffle()[0];
};

干杯!

我認為countBy方法可以做到。 然后,您將希望獲得最大值(但如果它等於第二個最大值,則不是),因此您將需要top-K部分排序算法。 用5個元素擰緊它,我們只需要使用sortBy

var sorted = _.chain(results)
  .countBy(results, function(r) { return JSON.stringify(_.omit(r, "source")); })
  .map(function(c, r) { r = JSON.parse(r); r.occurrences = c; })
  .sortBy("occurrences").reverse()
  .value();
return sorted.length > 1
  && sorted[0].occurrences == sorted[1].occurrences
  && _.findWhere(results, {source:"E"})
  || sorted[0];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM