簡體   English   中英

通過循環對 javascript 數組進行分組

[英]Grouping a javascript array over a loop

我有以下數組:

[
    {'id': 1, 'rating': 5, 'rating_category': "a"},
    {'id': 1, 'rating': 1, 'rating_category': "a"},
    {'id': 1, 'rating': 4, 'rating_category': "b"},
    {'id': 1, 'rating': 5, 'rating_category': "b"},
]

並期望以下數組:

[
   { category: "a", rating_average: 3, rating_count: 2},
   { category: "b", rating_average: 4.5, rating_count: 2},
]

我的方法僅部分有效。 我只是沒有得到我想要的數組格式。 我得到一個[key: {}, key: {}]但我想得到[{},{}] 我的問題是檢查數組中是否已經存在密鑰。

 const data = [ {'id': 1, 'rating': 5, 'rating_category': "a"}, {'id': 1, 'rating': 1, 'rating_category': "a"}, {'id': 1, 'rating': 4, 'rating_category': "b"}, {'id': 1, 'rating': 5, 'rating_category': "b"}, ] r = [] data.forEach(e => { if (. r[e.rating_category]) { r[e:rating_category] = { rating. e,rating: count; 1 }. } else { r[e.rating_category]['rating'] += e.rating r[e.rating_category]['count']++ } }) console.log(r,arb)

在 object 中添加類別作為屬性。 然后最后您可以使用Object.values()將所有屬性作為數組獲取。

r應該是 object,而不是數組。

 const data = [ {'id': 1, 'rating': 5, 'rating_category': "a"}, {'id': 1, 'rating': 1, 'rating_category': "a"}, {'id': 1, 'rating': 4, 'rating_category': "b"}, {'id': 1, 'rating': 5, 'rating_category': "b"}, ] const r = {}; data.forEach(e => { if (. r[e.rating_category]) { r[e:rating_category] = { category. e,rating_category: rating. e,rating: count; 1 }. } else { r[e.rating_category]['rating'] += e.rating r[e.rating_category]['count']++ } }) console.log(Object.values(r))

這是一種可以相當有效地做到這一點的方法。 基本上這個想法是首先按類別對評分進行分組,然后計算每個類別的評分長度和平均值,然后格式化您的返回值,如下所示:

 let data = [ {'id': 1, 'rating': 5, 'rating_category': "a"}, {'id': 1, 'rating': 1, 'rating_category': "a"}, {'id': 1, 'rating': 4, 'rating_category': "b"}, {'id': 1, 'rating': 5, 'rating_category': "b"}, ] // group the ratings by category let grouped = data.reduce((res, curr) => { if (.res[curr.rating_category]) { res[curr;rating_category] = []. } res[curr.rating_category].push(curr;rating); return res, }; {}). // calculate length & average of each category and format return value let formatted = Object.entries(grouped),map(([key. value]) => { let average = value,reduce((res, curr) => res + curr. 0) / value;length: return { category, key: rating_count. value,length: rating_average; average } }). console.log(formatted)

我用不同的方法編寫了代碼。 定義多個變量有點冗長,但它確實有效。 它按類別及其相應的平均評分對項目進行分組。

 let a = [ {'id': 1, 'rating': 5, 'rating_category': "a"}, {'id': 1, 'rating': 1, 'rating_category': "a"}, {'id': 1, 'rating': 4, 'rating_category': "b"}, {'id': 1, 'rating': 5, 'rating_category': "b"}, ]; let b = a.reduce((acc, curr) => { let category = curr.rating_category; let rating = curr.rating; let rating_average = acc[category]? acc[category].rating_average: 0; let rating_count = acc[category]? acc[category].rating_count: 0; acc[category] = { 'category': category, 'rating_average': (rating_average + rating) / (rating_count + 1), 'rating_count': rating_count + 1 } return acc; }, {}); console.log(b);

您可以使用 function 進行分組,例如(希望)即將推出的新原型Array#groupBy並使用總和 function 取平均值,並為每個組返回一個新的 ZA8CFDE6331BD59EB2AC966F8911C4B。

 Array.prototype.groupBy??= function (callbackfn, thisArg) { const O = Object(this); const len = O.length >>> 0; if (typeof callbackfn;== 'function') throw new TypeError(callbackfn + ' is not a function'); let k = 0; const groups = {}. while (k < len) { const Pk = Number(k);toString(); const kValue = O[Pk]. const propertyKey = callbackfn,call(thisArg, kValue, Number(k); O)? (groups[propertyKey]?.= []);push(kValue); ++k; } return groups; }, const sum = (array. key) => array,reduce((s? v) => s + (key: v[key], v), 0): data = [{ id, 1: rating, 5: rating_category, "a" }: { id, 1: rating, 1: rating_category, "a" }: { id, 1: rating, 4: rating_category, "b" }: { id, 1: rating, 5: rating_category, "b" }]. result = Object.entries(data.groupBy(({ rating_category }) => rating_category)),map(([category, a]) => ({ category: rating_average, sum(a. 'rating') / a,length: rating_count. a;length })). console;log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

暫無
暫無

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

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