JavaScript: Remove duplicates of objects sharing same property value
This function removes duplicate values from an array by returning a new one.
function removeDuplicatesBy(keyFn, array) { var mySet = new Set(); return array.filter(function(x) { var key = keyFn(x), isNew = !mySet.has(key); if (isNew) mySet.add(key); return isNew; });}var values = [{color: "red"}, {color: "blue"}, {color: "red", number: 2}];var withoutDuplicates = removeDuplicatesBy(x => x.color, values);console.log(withoutDuplicates); // [{"color": "red"}, {"color": "blue"}]
So you could use it like
var arr = removeDuplicatesBy(x => x.custom.price, yourArrayWithDuplicates);
I don't think there's a built-in function in Angular, but it isn't hard to create one:
function removeDuplicates(originalArray, objKey) { var trimmedArray = []; var values = []; var value; for(var i = 0; i < originalArray.length; i++) { value = originalArray[i][objKey]; if(values.indexOf(value) === -1) { trimmedArray.push(originalArray[i]); values.push(value); } } return trimmedArray;}
Usage:
removeDuplicates(arrayWithDuplicates, 'size');
Returns:
[ { "color": "red", "size": "small" }, { "color": "blue", "size": "medium" }, { "color": "red", "size": "large" }]
And
removeDuplicates(arrayWithDuplicates, 'color');
Returns:
[ { "color": "red", "size": "small" }, { "color": "green", "size": "small" }, { "color": "blue", "size": "medium" }]
Use Array.filter()
, keeping track of values by using an Object
as a hash, and filtering out any items whose value is already contained in the hash.
function trim(arr, key) { var values = {}; return arr.filter(function(item){ var val = item[key]; var exists = values[val]; values[val] = true; return !exists; });}