JavaScript 通过两个属性分组JSON对象并计数
问题陈述:我们需要将JSON对象的两个属性相加并计算其出现次数。例如,如果我们在JSON中有姓名和年龄属性,那么将它们分组在一个单独的属性中,并计算它们的出现次数。
什么是JSON
JSON(JavaScript对象表示法)是在设备之间进行轻量级数据传输的格式。它是人类可读和可写的数据。 JSON的形式是键值对。键是用字符串来定义值的。在JSON中,每个条目都由分号分隔。例如 – {“name”:”Peter”},在这个例子中,name是一个键,Peter是它的值。
const jsonData = [
{ name: 'Aaroni', year: 2020, month: 'May' },
{ name: 'Peter', year: 2021, month: 'December' },
{ name: 'Jack', year: 2021, month: 'March' },
]
理解问题
为了解决这个问题,我们将使用JSON数据的两个属性,并将它们与underscore结合起来。然后检查是否分组在一起,并且具有相同值的属性,然后将计数器增加1。如果没有找到分组,则返回计数1。
步骤
下面的算法专注于合并JSON对象的两个属性并计算其值。按照以下步骤实施给定的问题-
步骤1 :定义一个名为jsonData的JSON数据。
步骤2 :声明一个名为dataCount的函数。它有3个参数,数组,p1和p2。
步骤3 :创建一个空对象来存储结果JSON数据。
步骤4 :初始化一个for循环,迭代到数组的长度。
步骤5 :现在使用相同的索引值使用underscore添加两个属性p1和p2。并将该值分配给batch变量。
步骤6 :放置一个if else块来检查条件。如果未找到分组批次,则将其值设置为1。否则,增加1。
步骤7 :当在for循环中迭代所有元素时,返回组的值。
步骤8 :现在调用函数dataGrouped并传递参数。
步骤9 :打印程序的结果。
示例
// Define array in JSON format
const jsonData = [
{"location":"Kerala", "identity":"Employee"},
{"location":"Kerala", "identity":"Visitor"},
{"location":"Kerala", "identity":"Visitor"},
{"location":"Kerala", "identity":"Worker"},
{"location":"Mumbai", "identity":"Employee"},
{"location":"Mumbai", "identity":"resident"},
{"location":"Mumbai", "identity":"Worker"},
{"location":"Mumbai", "identity":"Resident"},
{"location":"Hyderabad", "identity":"Resident"},
{"location":"Hyderabad", "identity":"Homemaker"},
{"location":"Hyderabad", "identity":"Employee"},
{"location":"Hyderabad", "identity":"Resident"},
{"location":"Hyderabad", "identity":"Homemaker"},
{"location":"Hyderabad", "identity":"Resident"}
];
//Define function with three arguments array, p1 and p2
function dataCount(array, p1, p2) {
const group = {};
// initialize a for loop
for (let i = 0; i < array.length; i++) {
//adding properties of array with _
const batch = array[i][p1] + '_' + array[i][p2];
// Conditional statements if
if (!group[batch]) {
group[batch] = 1;
} else {
group[batch]++;
}
}
//return group value
return group;
}
//Calling function with by passing arguments
const dataGrouped = dataCount(jsonData , 'location', 'identity');
//Print the output
console.log("After grouping JSON data, count is as follows")
console.log(dataGrouped);
输出
After grouping JSON data, count is as follows
{
Kerala_Employee: 1,
Kerala_Visitor: 2,
Kerala_Worker: 1,
Mumbai_Employee: 1,
Mumbai_resident: 1,
Mumbai_Worker: 1,
Mumbai_Resident: 1,
Hyderabad_Resident: 3,
Hyderabad_Homemaker: 2,
Hyderabad_Employee: 1
}
在上面的代码中,我们以JSON的形式定义了一个数组。在这个数据中,对象以键值对的形式分开。有两个键被定义,第一个是location,第二个是identity。所以存在一些重复的数据。我们需要对它们进行排序并计数。
在下一步中,我们创建了一个函数来解决这个问题。所以基本上我们在函数中传递了三个参数。第一个参数是数组,第二个是属性p1,第三个也是属性p2。现在group是一个空的JSON数组。
然后我们初始化了一个for循环,以运行直到数组的最后一个索引。之后,我们用下划线将两个属性组合在一起,得到一个属性,并将其分配给一个批次变量。
现在我们定义了一个if else块。它将检查group是否可用,如果可用则增加其计数,否则将其保持为1。在最后一步返回group的值,并使用给定的参数调用函数。
时间和空间复杂度
所以我们得出结论,对于这个问题,函数dataCount()只适用于对象中存在的元素数量。那么时间复杂度将为O(n)。这里n是输入数据的长度。而程序将占用相同的内存O(n),因为整个函数在group对象中存储了每批次的一个计数值。
结论
这是处理JSON数据的基本功能。我们已经看到了如何计算JSON中相似数据的出现次数,以减少数据的复杂性,并在另一个JSON对象中显示它们。在程序中,我们只使用了javascript的简单语法来得到最终输出。