繁体   English   中英

在javascript中查找对象中键值对的频率

[英]finding the frequency of a key value pair in an object in javascript

想象我有一个对象

teaherList = [
{teacherID:1,teacherName:"john"},
{teacherID:2,teacherName:"joe"},
{teacherID:3,teacherName:"jill"},
{teacherID:1,teacherName:"john"},
{teacherID:2,teacherName:"joe"},
{teacherID:3,teacherName:"jill"},
{teacherID:1,teacherName:"john"},
{teacherID:2,teacherName:"joe"},
{teacherID:3,teacherName:"jill"},
]

现在如何在对象teaherList中找到每个[teacherID: ,teacherName: ]的频率

目前我在做的是,

let temp = []
_.each(teaherList, function(k){
   temp.push(k.teacherID)
)

let count1 = countBy(temp);

好吧,它给出了对象中教师发生的频率,但有一种更好,更高效的方法来完成这项任务

假设teaherList是一个对象数组,这里的方法不需要依赖于库,并且一次创建输出对象(总迭代次数=数组长度),使用reduce

 const teaherList = [ {teacherID:1,teacherName:"john"}, {teacherID:2,teacherName:"joe"}, {teacherID:3,teacherName:"jill"}, {teacherID:1,teacherName:"john"}, {teacherID:2,teacherName:"joe"}, {teacherID:3,teacherName:"jill"}, {teacherID:1,teacherName:"john"}, {teacherID:2,teacherName:"joe"}, {teacherID:3,teacherName:"jill"}, ]; console.log( teaherList.reduce((a, { teacherName }) => ( Object.assign(a, { [teacherName]: (a[teacherName] || 0) + 1 }) ), {}) ); 

let temp = []
_.each(teaherList, function(k){
   temp.push(k.teacherID)
)

let count1 = countBy(temp);
console.log(count1) // object
//(1:3,2:3,3:3)

如果有更好的方法,请告诉我

您可以使用Array#forEach而无需开销来分配对象并为每个循环返回对象。

 var teacherList = [{ teacherID: 1, teacherName: "john" }, { teacherID: 2, teacherName: "joe" }, { teacherID: 3, teacherName: "jill" }, { teacherID: 1, teacherName: "john" }, { teacherID: 2, teacherName: "joe" }, { teacherID: 3, teacherName: "jill" }, { teacherID: 1, teacherName: "john" }, { teacherID: 2, teacherName: "joe" }, { teacherID: 3, teacherName: "jill" }], frequency = Object.create(null); teacherList.forEach(({ teacherName }) => frequency[teacherName] = (frequency[teacherName] || 0) + 1); console.log(frequency); 

这是使用while循环进行此操作的另一种方法。

 teaherList = [{teacherID:1,teacherName:"john"},{teacherID:2,teacherName:"joe"},{teacherID:3,teacherName:"jill"},{teacherID:1,teacherName:"john"},{teacherID:2,teacherName:"joe"},{teacherID:3,teacherName:"jill"},{teacherID:1,teacherName:"john"},{teacherID:2,teacherName:"joe"},{teacherID:3,teacherName:"jill"}]; const calculateFrequencies = ({ input, output = Object.create(null), id, name, start: i = 0, end = input.length }) => { while(i < end && ({ teacherID: id, teacherName: name } = input[i++])) ++(output[id] || (output[id] = { id, name, count: 0 })).count; return Object.values(output); } console.log(calculateFrequencies({ input: teaherList })); 

我修改了这个teaherList ,因为那不是有效的对象。 您可以尝试这样的事情,结果数组将是这样的[{teacherID1:teacherName1},{teacherID2:teacherName2}]

 var teaherList = [ {teacherID:1,teacherName:"john"}, {teacherID:2,teacherName:"joe"}, {teacherID:3,teacherName:"jill"}, {teacherID:1,teacherName:"john"}, {teacherID:2,teacherName:"joe"}, {teacherID:3,teacherName:"jill"}, {teacherID:1,teacherName:"john"}, {teacherID:2,teacherName:"joe"}, {teacherID:3,teacherName:"jill"}, ] var result = teaherList.reduce(function(acc, cV) { if(!acc[cV.teacherName]) { acc[cV.teacherName]= {teacherID: cV.teacherID, teacherName: cV.teacherName, count: 1}; } else { acc[cV.teacherName].count++; } return acc; }, {}); console.log(result); 

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM