5

I would like to find index in array. Positions in array are objects, and I want to filter on their properties. I know which keys I want to filter and their values. Problem is to get index of array which meets the criteria.

For now I made code to filter data and gives me back object data, but not index of array.

var data =  [
        {
            "text":"one","siteid":"1","chid":"default","userid":"8","time":1374156747
        },
        {
            "text":"two","siteid":"1","chid":"default","userid":"7","time":1374156735
        }
    ];

var filterparams = {userid:'7', chid: 'default'};

function getIndexOfArray(thelist, props){
    var pnames = _.keys(props)
    return _.find(thelist, function(obj){
        return _.all(pnames, function(pname){return obj[pname] == props[pname]})
    })};

var check = getIndexOfArray(data, filterparams ); // Want to get '2', not key => val
1
  • 2
    not really an answer but you could have used _.findWhere to get exactly the same result as what you have now Commented Jul 18, 2013 at 16:18

4 Answers 4

11

Using Lo-Dash in place of underscore you can do it pretty easily with _.findIndex().

var index = _.findIndex(array, { userid: '7', chid: 'default' })
Sign up to request clarification or add additional context in comments.

Comments

2

here is thefiddle hope it helps you

 for(var intIndex=0;intIndex < data.length; intIndex++){
  eachobj = data[intIndex];
var flag = true;
 for (var k in filterparams) {

    if (eachobj.hasOwnProperty(k)) {
        if(eachobj[k].toString() != filterparams[k].toString()){
           flag = false;
        }
    }
}
if(flag){
       alert(intIndex);
}

}

Comments

2

I'm not sure, but I think that this is what you need:

var data =  [{
    "text":"one","siteid":"1","chid":"default","userid":"8","time":1374156747
}, {
    "text":"two","siteid":"1","chid":"default","userid":"7","time":1374156735
}];
var filterparams = {userid:'7', chid: 'default'};

var index = data.indexOf( _.findWhere( data, filterparams ) );

1 Comment

This should be the accepted answer since it IS using underscore.
0

I don't think you need underscore for that just regular ole js - hope this is what you are looking for

var data =  [
        {
            "text":"one","siteid":"1","chid":"default","userid":"8","time":1374156747
        },
        {
            "text":"two","siteid":"1","chid":"default","userid":"7","time":1374156735
        }
    ];

var userid = "userid"
var filterparams = {userid:'7', chid: 'default'};
var index;
for (i=0; i < data.length; i++) {
    for (prop in data[i]) {
        if ((prop === userid) && (data[i]['userid'] === filterparams.userid)) {
            index = i
        }
    }
}

alert(index);

3 Comments

I think he wants an indexOf not a lastIndexOf
What's that prop === userid thing supposed to do there? Can't you omit the property enumeration of data[i] then entirely?
prop === userid has to equal the object's key value which I just stored in a variable

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.