Reputation: 39
data = [{a:1, b:2},{a:2, b:2},{a:2, b:2},{a:3, b:2},{a:3, b:2},{a:3, b:2}], we need to convert data array to data = [{a:1, b:2, count:1},{a:2, b:2, count:2},{a:3, b:2, count:3}]
I used this code, but it seems the key to the map is deep comparison. so even with the same string value, I got different keys
data = [{a:1, b:2},{a:2, b:2},{a:2, b:2},{a:3, b:2},{a:3, b:2},{a:3, b:2}]
data.sort();
let map= new Map()
for(let ele of data){
if(map.has(ele)){
map.set(ele,map.get(ele)+1)
}else{
map.set(ele,1)
}
}
console.log(map)
let arr = []
for(let[key,value]of map){
key.count=value
arr.push(key)
}
console.log(arr)
I also do an iteration of the data array, but the same problem occurs.
let arr=[]
let count = 1
data[0].count = count
for(let i = 1; i < data.length; i ++){
if(data[i]==data[i-1]){
arr[arr.length-1].count++
} else{
data[i].count = 1
arr.push(data[i])
}
}
So is there a better way to duel with it?
Upvotes: 1
Views: 49
Reputation: 370789
Comparing objects will require checking that the number of keys is the same, and that each key-value pair exists in both. It'll require a bit of boilerplate.
const isSameObj = (obj1, obj2) => (
Object.keys(obj1).length === Object.keys(obj2).length &&
Object.entries(obj1).every(([key, val]) => obj2.hasOwnProperty(key) && obj2[key] === val)
);
const data = [{ a: 1, b: 2 }, { a: 2, b: 2 }, { a: 2, b: 2 }, { a: 3, b: 2 }, { a: 3, b: 2 }, { a: 3, b: 2 }];
const map = new Map();
for (const obj1 of data) {
const foundObj = [...map.keys()].find(obj2 => isSameObj(obj1, obj2));
if (foundObj) {
map.set(foundObj, map.get(foundObj) + 1);
} else {
map.set(obj1, 1);
}
}
const output = [...map.entries()]
.map(([obj, count]) => ({ ...obj, count }));
console.log(output);
Upvotes: 2