所以我有一个像这样的对象数组:
let arrayOfObjects = [
{
Name: "Apple",
Type: "Fruit"
},
{
Name: "Carrot",
Type: "Vegetable"
},
{
Name: "Carrot",
Type: "Vegetable"
},
{
Name: "Carrot",
Type: "Vegetable"
},
{
Name: "Apple",
Type: "Fruit"
},
{
Name: "Apple",
Type: "Fruit"
},
{
Name: "Carrot",
Type: "Vegetable"
}
];
我需要遍历它,查找重复项,并为每个重复项仅返回一个对象,但是将重复项的数量作为新参数。
像这样:
let newArrayOfObjects = [
{
Name: "Apple",
Type: "Fruit",
times: 3,
},
{
Name: "Carrot",
Type: "Vegetable",
times: 4,
}
];
我可以根据一个参数计算重复的对象,但我不知道如何基于整个对象。解决此问题的最佳方法是什么?
我认为您最适合创建一个辅助对象。辅助对象最初将是空的,但将根据您正在阅读的内容慢慢填充。我将假设数组中的键是一致的。
const keys = ["Name","Type"]
var counterObj = {}
let keyForCounterObj
arrayOfObjects.forEach((obj)=>{
keyForCounterObj = ''
keys.forEach((key)=>{
keyForCounterObj += String(obj[key])
}
if(counterObj[keyForCounterObj]){
counterObj[keyForCounterObj].times ++
}else{
counterObj[keyForCounterObj] = {
...obj,
times:1
}}}
让我们来分解一下,因为我知道如果您以前从未看过此设置,可能会有些困惑。
我们遍历数组中的每个对象,并根据该对象存储的所有值构造一个键。例如,arrayOfObjects [0]将创建一个键“ AppleFruit”。(我使用String()方法只是为了将其应用于仅具有整数或浮点值的对象,因为这些值对于在javaScript中创建键是无效的。对于您的特定问题而言,这不是必需的)
有了该密钥后,我们将检查它是否存在于我们的counterObject中。如果它不存在,那么我们定义它。我们将“ times”属性设置为1,因为我们刚刚创建了此对象;除非我们刚刚找到它,否则它将不存在。
如果对象已经存在,那么我们只需增加“ times”属性即可。最后,我们有一个看起来像这样的对象:
counterObj = {
AppleFruit: {
Name:"Apple",
Type:"Fruit",
times:3,
},
CarrotVegetable:{
Name:"Carrot",
Type:"Vegetable",
times:4,
}
}
好的,现在我们有了对象的对象。让我们把它变成一个数组!
let newArrayOfObjects = []
const counterObjKeys = Object.keys(counterObj)
counterObjKeys.forEach((key)=>{
newArrayOfObjects.push(counterObj[key])
}
这将以您指定的格式返回最终值!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句