6

I have a lot of objects that I'm trying to filter out duplicates from. When an object has a property, IMAGEURL which is present in another object, I want to ignore this object and move on.

I'm using nodeJS for this so if there's a library I can use to make it easier let me know.

I've done similar implementations before with checking string values in arrays, doing something like:

var arr = ['foo', 'bar'];
if(arr.indexOf('foo') == -1){
   arr.push('foo')
}

But this won't work for objects, as best I can tell. What are my options here? To put it more simply:

var obj1 = {IMAGEURL: 'http://whatever.com/1'};
var obj2 = {IMAGEURL: 'http://whatever.com/2'};
var obj3 = {IMAGEURL: 'http://whatever.com/1'};

var arr = [obj1, obj2, obj3];
var uniqueArr = [];

for (var i = 0; i<arr.length; i++){
    // For all the iterations of 'uniqueArr', if uniqueArr[interation].IMAGEURL == arr[i].IMAGEURL, don't add arr[i] to uniqueArr
}

How can I do this?

2 Answers 2

12

You can just use an inner loop (keeping track of whether we've seen the loop by using a seen variable -- you can actually use labels here, but I find the variable method to be easier to read):

for (var i = 0; i<arr.length; i++){
    var seen = false;
    for(var j = 0; j != uniqueArr.length; ++j) {
        if(uniqueArr[j].IMAGEURL == arr[i].IMAGEURL) seen = true;
    }
    if(!seen) uniqueArr.push(arr[i]);
}
Sign up to request clarification or add additional context in comments.

2 Comments

Can you explain why you've done j != uniqueArr.length and not j < uniqueArr.length? Don't quite see what's going on here.
@Jascination you can do < instead of != in this case. In this particular case, since j increases by 1 each step, both yield the same results. I just use != in these loops by default (opting for < or > when it is necessary)
3

Here is a concise way:

var uniqueArr = arr.filter(function(obj){
    if(obj.IMAGEURL in this) return false;
    return this[obj.IMAGEURL] = true;
}, {});

http://jsfiddle.net/rneTR/2

Note: this is concise, but orders of magnitude slower than Nirk's answer.

See also: http://monkeyandcrow.com/blog/why_javascripts_filter_is_slow/

1 Comment

You could do uniqueArr = arr.filter(function(obj){return (uniqueArr.map(function(x){return x.IMAGEURL;}).indexOf(obj.IMAGEURL) != -1) ? false : (uniqueArr.push(obj), true);});, but I strongly advise against it unless you know what you are doing

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.