Greg
Greg

Reputation: 1055

Search for duplicate strings in array of objects in 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"}]

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

Answers (3)

Roy J
Roy J

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

Matt Burland
Matt Burland

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

Latheesan
Latheesan

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):

enter image description here

Upvotes: 0

Related Questions