Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Searching object using AND and OR

9 views
Skip to first unread message

Andrew Poulos

unread,
Oct 10, 2012, 6:36:13 PM10/10/12
to
I've got a large (potentially hundreds of indexes) object that looks
something like

var obj = {
"a":["apple","banana"],
"b":["fish","apple","car","run","jump"],
"c":["car,"truck","motorcycle","banana"],
"d":["banana","boat","car","bicycle"],
...
};

Where array elements can only be individual words.

Its straightforward enough to go through the object and return all
indexes where a "search" word matches an element in the index's array
but I'm stuck trying to work out how to even approach allowing the use
of "AND" and "OR".

For example, to search for
banana AND (bicycle OR motorcycle)
would return "c" and "d".

Andrew Poulos

Thomas 'PointedEars' Lahn

unread,
Oct 10, 2012, 7:13:20 PM10/10/12
to
Since you are looking for the property names, based on the words, ISTM you
should transform `obj' into an index object that is referred by

{
"apple": ["a", "b"],
"banana" ["a", "c", "d"],
"bicycle": ["d"],
"boat": ["d"],
"car": ["b", "c", "d"],
"fish": ["b"],
"jump": ["b"],
"motorcycle": ["c"],
"run": ["b"],
"truck": ["c"],
...
};

Then, applying knowledge about the equivalence of boolean and set
operations, the solution should present itself.

HTH


PointedEars
--
When all you know is jQuery, every problem looks $(olvable).

Dr J R Stockton

unread,
Oct 11, 2012, 3:00:57 PM10/11/12
to
In comp.lang.javascript message <ZaOdnXdCIZD3ZejNnZ2dnUVZ_vWdnZ2d@westne
t.com.au>, Thu, 11 Oct 2012 09:36:13, Andrew Poulos
<ap_...@hotmail.com> posted:
This OBJ looks something like your obj (and can be made from it)

var OBJ = {
"a":{"apple":1,"banana":1},
"b":{"fish":1,"apple":1,"car":1,"run":1,"jump":1},
"c":{"car":1,"truck":1,"motorcycle":1,"banana":1},
"d":{"banana":1,"boat":1,"car":1,"bicycle":1}};

S = ""
for (Z in OBJ) {
El = OBJ[Z]
if (El["banana"] && (El["bicycle"] || El["motorcycle"]) ) S += Z }
S // now cd <g>


--
(c) John Stockton, nr London UK Reply address via Home Page.
news:comp.lang.javascript FAQ <http://www.jibbering.com/faq/index.html>.
<http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
<http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.

Gene Wirchenko

unread,
Oct 11, 2012, 7:39:57 PM10/11/12
to
On Thu, 11 Oct 2012 20:00:57 +0100, Dr J R Stockton
<repl...@merlyn.demon.co.uk.invalid> wrote:

[snip]

>This OBJ looks something like your obj (and can be made from it)
>
>var OBJ = {
> "a":{"apple":1,"banana":1},
> "b":{"fish":1,"apple":1,"car":1,"run":1,"jump":1},
> "c":{"car":1,"truck":1,"motorcycle":1,"banana":1},
> "d":{"banana":1,"boat":1,"car":1,"bicycle":1}};
>
>S = ""
>for (Z in OBJ) {
> El = OBJ[Z]
> if (El["banana"] && (El["bicycle"] || El["motorcycle"]) ) S += Z }
>S // now cd <g>

Nice! Thank you for the lesson.

Sincerely,

Gene Wirchenko

JJ

unread,
Oct 12, 2012, 9:25:59 AM10/12/12
to
Using your object format...

Example to case-sensitively search for:
banana AND (bicycle OR motorcycle)

var obj = {
"a":["apple","banana"],
"b":["fish","apple","car","run","jump"],
"c":["car","truck","motorcycle","banana"],
"d":["banana","boat","car","bicycle"]
};

var result = [];

//test each obj arrays
for (var i in obj) {
//skip array if no banana
if (obj[i].indexOf('banana') < 0) continue;
//check for bicycle or motorcycle
//in each array element
for (var j = 0; j < obj[i].length; j++) {
if (
(obj[i][j] == 'bicycle') ||
(obj[i][j] == 'motorcycle')
) {
//found one. save result
result.push(i);
//no need to search further
break;
}
}
}

console.log(result);
//shows: ["c", "d"]

//or...
console.log(result.join(''));
//shows: cd
0 new messages