在 JavaScript 中合并和分组对象属性
在给定的问题中,我们必须借助 javascript 合并和分组对象属性。在本文中,您将学习如何在 javascript 中合并和分组相同类型的属性。
理解问题
我们需要创建一个 javascript 方法,该方法将接受一个对象数组。创建的函数应该将所有具有 name 属性值的对象的所有属性分组。例如:
输入
[
{name: 'Adi', age: 22, color:'Black'},
{name: 'Adi', weight: 40, height:6} ,
{name: 'Mack', age: 20}
]
输出
[
{name: 'Adi', age: 22, color:'Black', weight: 40, height:6},
{name: 'Mack', age: 20}
]
算法 - 使用reduce方法
下面提到的算法将逐步给出解决给定问题的过程。
步骤1:首先定义一个名为groupedData的数据数组。此应用程序中的此数组接收对reduce()方法的调用,其初始值为空对象。参数acc和curr被传递给回调函数。
步骤2:每次使用reduce()方法时,回调函数首先使用解构从curr对象中删除state属性,然后使用扩展运算符构建具有剩余属性的新对象。
步骤3:然后回调函数确定state属性是否先前已用作acc对象中的键。如果是,则将当前对象的人口添加到该状态已存在的人口中。如果没有,curr 对象的状态和其他属性将转移到 acc 对象中的新条目。
步骤 4:result 变量用于使用 Object.values() 方法将 groupedData 对象转换回对象数组。
步骤 5:显示结果输出。
示例
// 定义一个函数来检查 3 的幂
const data = [
{ city: "New York", state: "NY", population: 100000 },
{ city: "San Francisco", state: "CA", population: 50000 },
{ city: "Los Angeles", state: "CA", population: 200000 },
{ city: "San Diego", state: "CA", population: 10000 },
{ city: "Chicago", state: "IL", population: 150000 },
{ city: "Miami", state: "FL", population: 5000 }
];
const groupedData = data.reduce((acc, curr) => {
const { state, ...rest } = curr;
if (acc[state]) {
acc[state] = { ...acc[state], population: acc[state].population + curr.population };
} else {
acc[state] = { state, ...rest };
}
return acc;
}, {});
const result = Object.values(groupedData);
console.log(result);
输出
[
{ state: 'NY', city: 'New York', population: 100000 },
{ state: 'CA', city: 'San Francisco', population: 260000 },
{ state: 'IL', city: 'Chicago', population: 150000 },
{ state: 'FL', city: 'Miami', population: 5000 }
]
算法 - 使用 forEach 方法
使用 forEach 方法的算法步骤如下:
步骤 1:第一步,定义一个包含城市、州和人口键的数组,并在其中放入一些值。然后,创建一个空数组并将其命名为"groupedData"。
步骤 2:要在此程序中对数据数组使用 forEach() 方法,请使用带有名为 obj 的单个参数的回调函数。
步骤 3:回调函数利用解构在 forEach() 方法的每次迭代中从 obj 对象中删除 state 属性,然后使用扩展运算符构建具有剩余属性的新对象。
步骤 4:然后回调函数确定 state 属性是否曾在第四步中用作 groupedData 对象的键。如果是,则该州的人口数将增加当前项目的人口数。如果不是,则将 obj 对象中的州和其他属性添加到 groupedData 对象中的新项目中。
步骤 5:使用 Object.values() 函数将 groupedData 对象转换回对象数组并保存在结果变量中。
示例
const data = [
{ city: "New York", state: "NY", population: 100000 },
{ city: "San Francisco", state: "CA", population: 50000 },
{ city: "Los Angeles", state: "CA", population: 200000 },
{ city: "San Diego", state: "CA", population: 10000 },
{ city: "Chicago", state: "IL", population: 150000 },
{ city: "Miami", state: "FL", population: 5000 }
];
const groupedData = {};
data.forEach((obj) => {
const { state, ...rest } = obj;
if (groupedData[state]) {
groupedData[state].population += obj.population;
} else {
groupedData[state] = { state, ...rest };
}
});
const result = Object.values(groupedData);
console.log(result);
时间复杂度
该程序的时间复杂度为 O(n),其中 n 为数字。这是因为 reduce 和 forEach 函数采用数组的长度来生成结果。
因此该程序的空间复杂度为 O(n),因为它使用 n 个内存来存储数组。
结论
这是解决此类问题的基本思想。在整个过程中,我们使用了 JavaScript 的 Reduce 和 ForEach 函数、算术运算符和比较运算符来解决问题。并了解了如何计算算法的时间和空间复杂度。
相关文章
有用资源
javascript 参考教程 - 该教程包含有关 javascript 的更多信息:https://www.cainiaomax.com/javascript/

