簡體   English   中英

計算javascript中每個值的出現次數

[英]Count no of occurrence of each value in javascript

我以繁瑣的循環結束轉換

[{Name: "Daniel Montes", color: "red"},
 {Name: "Daniel Montes", color: "red"},
 {Name: "Daniel Montes", color: "red"},
 {Name: "Michelle Aguirre", color: "red"},
 {Name: "Daniel Montes", color: "green"}
]

[
{Name: "Daniel Montes", green:1,red:3},
{Name: "Michelle Aguirre", green:0,red:1},
]

紅色和綠色只有2種顏色,因此也可以進行硬編碼。

最好的方法是什么? 我們在lodash上有東西嗎?

 var input = [{Name: "Daniel Montes", color: "red"}, {Name: "Daniel Montes", color: "red"}, {Name: "Daniel Montes", color: "red"}, {Name: "Michelle Aguirre", color: "red"}, {Name: "Daniel Montes", color: "green"} ]; function solve(list){ var map = new Map(); var entry = null; for(var item of list){ if(!map.has(item.Name)) map.set(item.Name, {Name: item.Name}); entry = map.get(item.Name); if(entry.hasOwnProperty(item.color)) entry[item.color] = entry[item.color] + 1; else entry[item.color] = 1; } return Array.from(map.values()); } console.log(solve(input)) 

這是我為您撰寫的快速解決方案。

另一種方法是使用reduce 如果基於固定屬性Nameredgreen使用模板對象,則代碼可能會短一些。

以下兩種解決方案都使用索引對象來跟蹤命名對象在結果數組中的位置,類似於pattpass對Map的使用。 如果特定名稱具有該顏色,則第一個解決方案僅在解決方案中包括一種顏色。 第二種解決方案使用具有固定屬性的模板對象,因此,如果對象沒有顏色,則結果為0。

通過動態跟蹤顏色可以實現相同的結果,但是需要邏輯將零顏色添加到不具有零顏色的對象中(可能是循環)。

 var input = [{Name: "Daniel Montes", color: "red"}, {Name: "Daniel Montes", color: "red"}, {Name: "Daniel Montes", color: "red"}, {Name: "Michelle Aguirre", color: "red"}, {Name: "Daniel Montes", color: "green"} ]; // Only add color if object has that color function process0(data) { var index = Object.create(null); return input.reduce(function (acc, obj) { var name = obj.Name, color = obj.color; // If haven't seen name before, add to index and // default object to accumulator if (!index[name]) { index[name] = acc.length; acc.push({Name:name}); } // If this name doesn't have the color as a property // ie red or green, add it if (!acc[index[name]].hasOwnProperty(color)) { acc[index[name]][color] = 0; } // Increment the color value ++acc[index[name]][color]; return acc; }, []); } console.log(process0(input)); // Use template object so if object doesn't have color, value is 0 // Same algorithm as above. function process1(data) { var index = Object.create(null); var temp = {red: 0, green: 0}; return input.reduce(function (acc, obj) { var name = obj.Name; if (!index[name]) { index[name] = acc.length; acc.push(Object.assign({}, {Name:name}, temp)); } ++acc[index[name]][obj.color]; return acc; }, []); } console.log(process1(input)); 

暫無
暫無

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

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