I have this array, in which each index contains an object literal. All of the object literals have the same properties. Some of the object literals have the same value for a given property, and I want to create a new array containing only those object literals.
My idea is to sort the array, and slice it into a new array...
Here is the array:
var arr = [];
arr[0] =
{
country: "United States",
num: 27
};
arr[1] =
{
country: "Australia",
num: 5
};
arr[2] =
{
country: "United States",
num: 7
};
So, I want to create a new array containing only those objects where the property country
is "United States". This is my crazy idea so far, which doesn't work:
function getNewArray(arr)
{
var arr2 = [];
for(var key in arr)
{
for(var i = 0; i < arr.length - 1; i++)
{
if(arr.hasOwnProperty(key) && arr[i].name == arr[i + 1].name)
{
arr2[i] = arr.slice(key);
}
}
}
return arr2;
}
var arr3 = getNewArray(arr).sort();
Demo: http://jsfiddle.net/YwytD/1/
There is a simpler way of doing this, I think this is what you want
var new_arr = arr.filter(function(obj){ return obj['country'] === 'United States'; })
This will filter your results into new_arr Of course you can make it better and more generic than just 'United States'Edit: Whoops, got your question just now
Answer: Nested Filters :)
This is exactly what the
Array.filter()
method is for:Note that the
.filter()
method isn't available in IE before version 9, but the MDN page I linked to above shows you exactly how to implement it so reading that page should in itself answer your question.Note also that in the (non-working) code in the question, your two
for
loops are basically doing the same thing as each other because they're both iterating overarr
, so it doesn't make sense to nest them like that. You shouldn't use a for..in loop on an array, but if you do thekey
values will be the numeric indexes, it doesn't somehow pick up the properties of the object stored at each index.EDIT:
OK, re-reading this I guess you didn't really want to select elements by specifying a country, you wanted to select elements for any country that had duplicate entries? So if there were another three elements that all had "New Zealand" you'd want to select them in addition to the "United States" ones? If so, you could do something like this:
Here is my solution:
here's a working example http://jsfiddle.net/michaelghayes/UyHYz/2/
Can you use JQuery?