Dan K.
Dan K.

Reputation: 59

Javascript Array of Objects and Unique Values

I have an array of objects that looks like this:

[
{"name":"Andrea","from":"USA","Food":"Candy"},
{"name":"Matt","from":"Taiwan","Food":"Chicken"},
{"name":"Roddy","from":"USA","Food":"Rice"},
{"name":"Andy","from":"Great Britain","Food":"Steak"},
];

Is there a way to get the list of all countries from the array above, and get rid of the repeated ones?

So from the list above, the list I am to obtain is:

["USA", "Taiwan", "Great Britain"]

Thank you!

Upvotes: 1

Views: 111

Answers (4)

GregL
GregL

Reputation: 38103

If you are already using the excellent Lodash library, the following will do it for you neatly in one line:

var uniqueCountries = _(dataArray).pluck('from').unique().value();

UnderscoreJS has similar functionality using chaining.

For D3.js, the following will do it:

var uniqueCountries = d3.set(dataArray.map(function (x) { return x.from; })).values();

Without doing the unique-ifying on the server and returning that data separately, there is no way to get around looping through all records at least once to do this. For 1000 records or so, though, this will still be very fast. For plain JS, see other answers.

Upvotes: 2

Grundy
Grundy

Reputation: 13381

Yet another variant with reduce

var arr = [
    {"name":"Andrea","from":"USA","Food":"Candy"},
    {"name":"Matt","from":"Taiwan","Food":"Chicken"},
    {"name":"Roddy","from":"USA","Food":"Rice"},
    {"name":"Andy","from":"Great Britain","Food":"Steak"},
];

var countries = arr.reduce(function(acc, cur){
                    if(!acc.map[cur.from]){
                        acc.map[cur.from]=true;
                        acc.result.push(cur.from);
                    }
                    return acc;
                }, {result:[], map:{}}).result;

var arr = [
    {"name":"Andrea","from":"USA","Food":"Candy"},
    {"name":"Matt","from":"Taiwan","Food":"Chicken"},
    {"name":"Roddy","from":"USA","Food":"Rice"},
    {"name":"Andy","from":"Great Britain","Food":"Steak"},
];

var countries = arr.reduce(function(acc, cur){
                    if(!acc.map[cur.from]){
                        acc.map[cur.from]=true;
                        acc.result.push(cur.from);
                    }
                    return acc;
                }, {result:[], map:{}}).result;

document.getElementById('countries').innerHTML = countries.join();
<span id="countries"></span>

Upvotes: 3

KJ Price
KJ Price

Reputation: 5964

Just loop over people and insert unique countries in a new array. Here is an example.

var countries = [];

var people = [
{"name":"Andrea","from":"USA","Food":"Candy"},
{"name":"Matt","from":"Taiwan","Food":"Chicken"},
{"name":"Roddy","from":"USA","Food":"Rice"},
{"name":"Andy","from":"Great Britain","Food":"Steak"},
];

for (var i = 0, l=people.length; i < l; i++) {
    if(people[i] && people[i].from) {//ensure country exists
        if (countries.indexOf(people[i].from) == -1) {//ensure unique
             countries.push(people[i].from);
        }
    }
}

Upvotes: 4

Tobias Kloss
Tobias Kloss

Reputation: 328

I'd loop over the Array and put the country into an array if it is not yet inside that array.

Upvotes: 1

Related Questions