user12094588
user12094588

Reputation: 321

How can speed up search loop?

There is a cycle with the condition how can it be optimized so that the search is faster?

for (var i = 0; i < db.rows.length; i++) {
    for (var j = 0; j < user.rows.length; j++) {
        for (var k = 0; k < work.length; k++) {
            if (db.rows[i].LOGIN === user.rows[j].login && work[k].name === db.rows[i].NAME) {

            }
        }
    }
}

Upvotes: 0

Views: 63

Answers (2)

Nina Scholz
Nina Scholz

Reputation: 386868

You could take two Maps for the user logins and work names.

var userLogins = new Map(user.rows.map(o => [o.login, o])),
    workNames = new Map(o => [o.name, o]),

for (var i = 0; i < db.rows.length; i++) {
    if (userLogins.has(db.rows[i].LOGIN) && workNames.has(work[k].name)) {
        // do something
    }
}

If you need just the simple check with using the objects of user.rows or work, you could take a Set instead.

var userLogins = new Set(user.rows.map(({ login } => login)),
    workNames = new Set(({ name }) => name),

for (var i = 0; i < db.rows.length; i++) {
    if (userLogins.has(db.rows[i].LOGIN) && workNames.has(work[k].name)) {
        // do something
    }
}

Upvotes: 1

Robby Cornelissen
Robby Cornelissen

Reputation: 97381

This is typically something that you would expect to see executed on the database.

That being said, you can split up the condition, so that you don't need to perform the second nested loop for every row:

for (var i = 0; i < db.rows.length; i++) {
    for (var j = 0; j < user.rows.length; j++) {
        if (db.rows[i].LOGIN === user.rows[j].login) {
            for (var k = 0; k < work.length; k++) {
                if (work[k].name === db.rows[i].NAME) {

                }
            }
        }
    }
}

Upvotes: 2

Related Questions