![](/img/trans.png)
[英]filter an array of objects based on an object with an array as it's property value in react
[英]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選擇理想結果的最佳方法是什么:
如果有一個(城市,地區)對出現的次數比其他任何對都多,請選擇該對(和國家/地區屬性)。
如果不存在比其他對多的對,例如:(a,a,b,b,c),(a,b,c,d,e),則選擇來源E及其信息。
如果源E不存在並且沒有共同的對,請選擇一個隨機源。
如果只有一個來源,顯然要選擇它。
某些來源也可能不存在。
下划線是我的最愛。 這符合您的所有條件。 在傳遞零長度數組的情況下,它返回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.