Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!feeder.erje.net!eu.feeder.erje.net!weretis.net!feeder1.news.weretis.net!news.solani.org!.POSTED!not-for-mail From: Thomas 'PointedEars' Lahn Newsgroups: comp.lang.javascript Subject: Re: function to get frequencies of a char array Date: Tue, 27 Jan 2015 03:03:05 +0100 Organization: PointedEars Software (PES) Lines: 68 Message-ID: <1859346.AqY2EoPZMB@PointedEars.de> References: <26839541.MRbOrngyXZ@PointedEars.de> <87twzgl0aq.fsf@bsb.me.uk> <2697158.aGRKFDBAEn@PointedEars.de> <87lhkskr0r.fsf@bsb.me.uk> <4289032.9WYFBcEGMJ@PointedEars.de> <87twzdf1gu.fsf@bsb.me.uk> Reply-To: Thomas 'PointedEars' Lahn Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit X-Trace: solani.org 1422324224 29758 eJwNwoERgEAIA7CVUNoK48AL+4+gl9B16TwQBe4PztOL4PSGK8YmmKrJWpuMGy96nWZR8P4AHlsRFA== (27 Jan 2015 02:03:44 GMT) X-Complaints-To: abuse@news.solani.org NNTP-Posting-Date: Tue, 27 Jan 2015 02:03:44 +0000 (UTC) User-Agent: KNode/4.14.2 X-User-ID: eJwVyMERACEIBLCWRNgVywGB/ku4uTwDpfAdI2gYjJ7qLr8REiOdC34al657e9eWHD6DSC23mJT/PLCYpUH7AGURFbg= Cancel-Lock: sha1:wZvWkFzATLcbGZdKCsB/b40RMvo= X-NNTP-Posting-Host: eJwFwYERADAEBLCVKP4Zp1ztP0KTMCiGjoDHxs5t5tP7tDLMzYd7CN2Sdno3xEjp5NjB1gcXORB+ Xref: csiph.com comp.lang.javascript:26726 Ben Bacarisse wrote: > Thomas 'PointedEars' Lahn writes: >> Ben Bacarisse wrote: >>> Thomas 'PointedEars' Lahn writes: >>>> Ben Bacarisse wrote: >>>>> Thomas 'PointedEars' Lahn writes: >>>>>> var counts = {}; >>>>>> >>>>>> for (var i = 0, len = a.length; i < len; ++i) >>>>>> { >>>>>> /* NOTE: hasOwnProperty() may be required */ >>>>>> var e = a[i]; >>>>>> e ? ++counts[e] : (counts[e] = 1); >>>>>> } >>>>> >>>>> I think you meant counts[e] ? ++counts[e] : (counts[e] = 1); here (and >>>>> immediately below): […] >>>> >>>> No, but >>>> >>>> if (e) { counts[e] ? ++counts[e] : (counts[e] = 1); } >>> >>> Why? >> >> Because there are sparse arrays ([To]String(“undefined”) === >> "undefined"). > > Isn't > > if (a.hasOwnProperty(i)) { counts[e] ? ++counts[e] : (counts[e] = 1); } > > a better way to deal with sparse arrays in such a loop? In general, it is a better way. However, since Array indexes are enumerable properties, you can also iterate over a filtered, sorted Object.keys(a), say var indexes = Object.keys(a).filter(function (e) { return +e >= 0 && +e < Math.pow(2, 32); }).sort(function (a, b) { return a - b; }); for (var ii = 0, len = indexes.length; ii < len; ++ii) { var e = a[indexes[ii]]; // … } Which approach is more efficient depends on the sparseness of the array; the latter solves the problem that iteration order is unspecified with “for–in” and includes inherited properties. That means you could do var reduced = Object.keys(a).filter(…).sort(…).map(…).reduce(…); > Testing e seems rather heavy-handed, though it's not clear what the OP > might want in anything but the simple case given. In a general counting > loop one would probably want to count zeros and NaNs and so on. Yes, as so often, this is limited to the use-case. -- PointedEars FAQ: | SVN: Twitter: @PointedEars2 | ES Matrix: Please do not cc me. / Bitte keine Kopien per E-Mail.