Reputation: 1055
var names = [{id:1,name:"name1"}, {id:2,name:"name2"}, {id:3,name:"name1"}, {id:4,name:"name1"}, {id:5,name:"name2"}, {id:6,name:"name3"}]
This is my array of objects in javascript - I am looking for a way to pull out all duplicates, and individuals that have the same name property - and place them into an object of arrays.. Filtering out the duplicate objects is my primary concern. If possible to do this in jQuery that is fine.
{
[{id:1,name:"name1"},{id:3,name:"name1"}{id:4,name:"name1"}]
[{id:2,name:"name2"},{id:5,name:"name2"}]
[{id:6,name:"name3"}]
}
Upvotes: 0
Views: 116
Reputation: 43881
The approach Matt Burland gives is the standard way of finding duplicates. I use it here, but at the same time build the array of arrays you were looking for.
var names = [{id:1,name:"name1"}, {id:2,name:"name2"}, {id:3,name:"name1"}, {id:4,name:"name1"}, {id:5,name:"name2"}, {id:6,name:"name3"}]
var collector = {};
var sorted = [];
for (var i = 0; i < names.length; ++i) {
var entry = names[i];
if (!(entry.name in collector)) {
collector[entry.name] = [];
sorted.push(collector[entry.name]);
}
collector[entry.name].push(entry);
}
console.dir(collector);
console.dir(sorted);
The requisite Fiddle
Upvotes: 1
Reputation: 45135
You could do something like this:
var names = [{id:1,name:"name1"}, {id:2,name:"name2"}, {id:3,name:"name1"}, {id:4,name:"name1"}, {id:5,name:"name2"}, {id:6,name:"name3"}]
var sorted = {};
for (var i=0; i < names.length; i++) {
if (!sorted[names[i].name]) {
sorted[names[i].name] = [];
}
sorted[names[i].name].push(names[i]);
}
Here's a fiddle.
If you want, for example, the array of all items with name == "name1"
, you just do:
var allName1s = sorted["name1"];
Upvotes: 1
Reputation: 24116
If you want to sort the data into valid and duplicate, i would do it like this:
Javascript:
<script type="text/javascript">
var names = [{id:1,name:"name1"}, {id:2,name:"name2"}, {id:3,name:"name1"}, {id:4,name:"name1"}, {id:5,name:"name2"}, {id:6,name:"name3"}]
var parsed_names = parseNames(names);
console.log(parsed_names);
function parseNames(names)
{
var parsed_data = [];
var duplicate_data = [];
var name_list = [];
for (var i = 0; i < names.length; i++) {
if (!inArray(names[i].name, name_list)) {
parsed_data.push(names[i]);
} else {
duplicate_data.push(names[i]);
}
name_list.push(names[i].name);
}
return {
'ParsedData': parsed_data,
'DuplicateData': duplicate_data
};
}
function inArray(needle, haystack) {
for (var i = 0; i < haystack.length; i++) {
if (haystack[i] === needle) {
return true;
}
}
return false;
}
</script>
Console output (debug):
Upvotes: 0