Board index » javascript » Return inex position of value in multi dim array
|
Andrew Poulos
Registered User |
|
Andrew Poulos
Registered User |
Return inex position of value in multi dim array
2005-03-03 04:53:03 AM
If I'm searching for an occurance of a value in a multi-dimensional array how can I get it's index returned as an array, if found? For example, if: foo = new Array(); foo = [1, 2, 3, [4, '4a'], 5, [6, 7, 8], 9, 10]; Array.prototype.findValue = function(val) { // blah } var foundInd = foo.findValue(8); Then searching for 8 returns [5, 2] and searching for 'fred' returns, say, -1. It's seemed simple enough with a one dimensional array but I'm stuck when the array is multi dimensional. Andrew Poulos - |
| Michael Winter
Registered User |
2005-03-03 08:01:00 PM
Re:Return inex position of value in multi dim array
Andrew Poulos wrote:
QuoteIf I'm searching for an occurance of a value in a multi-dimensional QuoteArray.prototype.findValue = function(val) { */ function isArray(o) { return ((o && ('object' == typeof o)) || ('function' == typeof o)) && (Array == o.constructor); } /* The findValue method returns the first matching value * using a depth-first search algorithm. If a match is * found, the return value will be an array containing * as many elements as necessary to subscript the match. * If no match was found, -1 is returned. * * For example, * * [1, [2, 3], 3] * * searching for 3 will return [1, 1] not [2]. Searching * for 4 will return -1. */ Array.prototype.findValue = function(v) {var i, j, n; for(i = 0, n = this.length; i < n; ++i) { /* If the current element is an array... */ if(isArray(this[i])) { /* ...search it for matching values. */ j = this[i].findValue(v); /* If the search was a success... */ if(-1 != j) { /* ...create an array containing the index of * the current element and append the result * of searching the nested array. */ return [i].concat(j); } /* If the current element matches the search value, * return an array containing the index of that * element. */ } else if(this[i] == v) {return [i];} } /* If no matches have been found, return -1. */ return -1; }; Instead of returning -1, you could also return an empty array. To do that, modify the most-nested if statement to: if(j.length) { and the final return statement to: return []; You might also want to change the "else if" condition to use strict equality. This would prevent '3' (string) from matching 3 (number). [snip] Hope that helps, Mike -- Michael Winter Replace ".invalid" with ".uk" to reply by e-mail. - |
| Dr John Stockton
Registered User |
2005-03-04 12:51:00 AM
Re:Return inex position of value in multi dim array
JRS: In article <422627a4$0$19799$5a62ac22@per-qv1-newsreader-
01.iinet.net.au>, dated Thu, 3 Mar 2005 07:53:03, seen in QuoteIf I'm searching for an occurance of a value in a multi-dimensional array is found, stack the index and scan. If nothing is found, you should get an empty stack. The stack can be an array. Presumably you only want the first entry. function Scan(F, B, V) { var j for (j=0 ; j<F.length ; j++) { if (F[j] == V) { B[B.length]=j ; return true } if (typeof F[j] == 'object') { B[B.length]=j /* push */ if (Scan(F[j], B, V)) return true B.length-- /* pop */ } } } foo = [1, 2, 3, [4, '4a'], 5, [6, 7, 8], 9, 10]; bar = [] val = 8 Scan(foo, bar, val) Answer = bar // an array value [5,2] It may need making safer; that assumes that an object entry can be treated as an array. Under-tested. Actually, this also serves; but it pushes and pops more often than needed :- function Scan(F, B, V) { var j for (j=0 ; j<F.length ; j++) { B[B.length]=j if (F[j] == V) return true if (typeof F[j] == 'object' && Scan(F[j], B, V)) return true B.length-- } } Then there is :- function Scan(F, B, V) { var j for (j in F) { B[B.length]=j if (F[j] == V) return true if (typeof F[j] == 'object' && Scan(F[j], B, V)) return true B.length-- } } foo = [1, new Date(), 3, {k:[1,8]}, [4, '4a'], 5, [6,, 7, 8], 9, 10]; giving [3,k,1] -- ?John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4 ? <URL:www.jibbering.com/faq/>JL/RC: FAQ of news:comp.lang.javascript <URL:www.merlyn.demon.co.uk/js-index.htm>jscr maths, dates, sources. <URL:www.merlyn.demon.co.uk/>TP/BP/Delphi/jscr/&c, FAQ items, links. - |
| rh
Registered User |
2005-03-04 01:48:00 PM
Re:Return inex position of value in multi dim array
Michael Winter wrote:
<..> Quote/* An array can either be an object or a function (varies by with [[Call]] implementation. Quotefunction isArray(o) { Array.prototype.findValue = function( val ) { for ( var k = 0, o, ret; k < this.length; k++ ) { if ( (o = this[k]) === val) return [k]; if (o && o.findValue === arguments.callee && (ret = o.findValue( val )) ) return ret.unshift( k ), ret; } } <..> ../rh - |
| Michael Winter
Registered User |
2005-03-04 04:48:00 PM
Re:Return inex position of value in multi dim array
rh wrote:
QuoteMichael Winter wrote: function. Anyway, at worst the user has to download an extra bit of an expression which is never executed. [snip] QuotePerhaps the isArray global requirement, Mike -- Michael Winter Replace ".invalid" with ".uk" to reply by e-mail. - |
| rh
Registered User |
2005-03-05 10:04:00 AM
Re:Return inex position of value in multi dim array
Michael Winter wrote:
Quoterh wrote: concrete example. Anything's possible, I suppose, but it would seem particularly strange to arise as a host dependency. <..> QuoteAnyway, at worst the user has to download an extra bit of an Quote[snip] - |
