I want to calculate number of unique value and put that in new array. I have below array:
[
{ CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
{ CategoryId: "9872cce5af92", CategoryName: "Category 2", CategoryColor: "purple" }
{ CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
]
I want new array with below result:
[
{ CategoryId: "b5c3f43f941c", count: 2, CategoryColor: "cgreen" }
{ CategoryId: "9872cce5af92", count: 1, CategoryColor: "purple" }
]
In this check by id, if id is same show count and new in new array.
Hope you understand what I want.
Thanks,
I want to calculate number of unique value and put that in new array. I have below array:
[
{ CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
{ CategoryId: "9872cce5af92", CategoryName: "Category 2", CategoryColor: "purple" }
{ CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
]
I want new array with below result:
[
{ CategoryId: "b5c3f43f941c", count: 2, CategoryColor: "cgreen" }
{ CategoryId: "9872cce5af92", count: 1, CategoryColor: "purple" }
]
In this check by id, if id is same show count and new in new array.
Hope you understand what I want.
Thanks,
Share Improve this question asked Nov 13, 2018 at 11:32 rohit13807rohit13807 5951 gold badge8 silver badges22 bronze badges 1- For any lodash users here: (_.uniqBy(arrayOfObjects, 'propertyName')).length – Dean Commented Sep 19, 2022 at 19:24
4 Answers
Reset to default 10You can loop through array using "for..of" and create a temporary object to save data in every loop. If same id exists in tempObject then increment count by 1
var arr = [
{ CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
, { CategoryId: "9872cce5af92", CategoryName: "Category 2", CategoryColor: "purple" }
, { CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
]
var tempResult = {}
for(let { CategoryColor, CategoryId } of arr)
tempResult[CategoryId] = {
CategoryId,
CategoryColor,
count: tempResult[CategoryId] ? tempResult[CategoryId].count + 1 : 1
}
let result = Object.values(tempResult)
console.log(result)
Use reduce
function and inside the callback check an object exist whose CategoryId
matches. If matches then update the count or else create a new object with the values and push in the array
let k = [{
CategoryId: "b5c3f43f941c",
CategoryName: "Category 1",
CategoryColor: "cgreen"
},
{
CategoryId: "9872cce5af92",
CategoryName: "Category 2",
CategoryColor: "purple"
},
{
CategoryId: "b5c3f43f941c",
CategoryName: "Category 1",
CategoryColor: "cgreen"
}
]
let result = k.reduce(function(acc, curr) {
// Check if there exist an object in empty array whose CategoryId matches
let isElemExist = acc.findIndex(function(item) {
return item.CategoryId === curr.CategoryId;
})
if (isElemExist === -1) {
let obj = {};
obj.CategoryId = curr.CategoryId;
obj.count = 1;
obj.CategoryColor = curr.CategoryColor;
acc.push(obj)
} else {
acc[isElemExist].count += 1
}
return acc;
}, [])
console.log(result)
You can sort the array first then count the duplicates. The downside is it will modify the original yourArray
due to being sorted, so use with caution.
yourArray.sort((a, b) => {
if (a.CategoryName > b.CategoryName) {
return 1;
}
if (a.CategoryName < b.CategoryName) {
return -1;
}
return 0;
});
var pivot = yourArray[0];
pivot.count = 0;
var counted = [pivot];
yourArray.forEach(item => {
if (item.CategoryId === pivot.CategoryId) {
pivot.count++;
} else {
pivot = item;
pivot.count = 1;
counted.push(pivot);
}
});
const array_unique = require('array-hyper-unique').array_unique
let arr = [
{ CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
{ CategoryId: "9872cce5af92", CategoryName: "Category 2", CategoryColor: "purple" }
{ CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
]
array_unique(arr).length