Array.unique()

2009.06.15. 21:26 stack

csak úgy, mert hasznos...

Array.prototype.has = function(v) {
    for(var i = this.length; i;) {
        if (this[--i] === v) {
            return true;
        }
    }
    return false;
};

Array.prototype.unique = function() {
    var a = [];
    for(var i = this.length; i;) {
        if (!a.has(this[--i])) {
            a.push(this[i]);
        }
    }
    return a;
};

UPDATE: az eredeti script közel kétszer annyi futási idővel dolgozott, ezért le lett cserélve...

... az előző:

Array.prototype.unique = function() {
    var a = [];
    var l = this.length;
    for (var i=0; i<l; i++) {
        for (var j=i+1; j<l; j++) {
            if (this[i] === this[j]) {
                j = ++i;
            }
        }
        a.push(this[i]);
    }
    return a;
};

14 komment

Címkék: unique array nem extjs

A bejegyzés trackback címe:

https://extjs.blog.hu/api/trackback/id/tr381187525

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

carstep 2009.06.17. 13:11:27

Hali, nagyon jo, talan jobb lenne a fuggvenyt getUniques -nak nevezni.

-cs-
Sanyi

stack 2009.06.17. 14:53:15

Szia! A fene tudja... elnevezéseknél jobb, ha az ember együtt halad a "tömeggel", mert kompaktibilisebb lesz. :)

Google-t megkérdeztem, és:
"Array.prototype.unique" 471 találat
"Array.prototype.getUniques" 0 találat

Sokszor szoktam én is feltalálni a spanyolviaszt, de most ezt a kódot én is csak "átemeltem" valahonnan. (mondjuk nem lenne bonyolult megírni, ugye:), de ha már ott így volt, akkor én is így használom, illetve itt így mutatom be. :)

prometheus_X 2009.06.18. 00:58:09

Esetleg alternatívaként a sajátom, ha már benéztem:
Array.prototype.has = function(v)
{
for (var i=0; i

prometheus_X 2009.06.18. 01:00:32

vazz... striptags()... nyüves WP. Remélem az entity-ket legalább átalakítja.

Array.prototype.has = function(v)
{
for (var i=0; i<this.length; i++) if (this[i] === v) return true;
return false;
}
Array.prototype.unique = function()
{
var result = [];
for (var i=0; i<this.length; i++) if (!result.has(this[i])) result.push(this[i]);
return result;
}
var o = new Ext.Window({width: 200, height: 100});
var a = [1, 2, 3, o, 2, 5, 0, o];
console.log(a);
console.log(a.unique());

prometheus_X 2009.06.18. 01:06:09

Amúgy a grides témában is haladok, csak eléggé apránként. Ha lesz érdemi fejlemény, szólok ahogy megígértem.

prometheus_X 2009.06.18. 01:25:29

Hm. Összevetettem a tiédet az enyémmel, és a sajátom rendre majdnem kétszer gyorsabb volt.

Átneveztem a tiédet unique2-re, FF-es mérőkód FireBug-gal:
var a = [], b = [], i = 0;
for (i=0; i<10000; i++)
{
    a.push(Math.round(Math.random() * 1000));
    b.push(Math.round(Math.random() * 1000));
}
console.time('a');
a.unique();
console.timeEnd('a');
console.time('b');
b.unique2();
console.timeEnd('b');

carstep 2009.06.18. 13:59:22

@prometheus_X: probald meg 'while -' osan megirni, az a leggyorsabb javascriptben

@stack: tovabbra is fenntartom, hogy ilyen illogikus/felrevezeto elnevezeseket nem ajanlatos hasznalni. En beszedes fuggvenyneveket hasznalok, hogy kesobb is tudjam mifan terem a fuggveny

elsore nem is tudtam mit akar a unique az array-al csinalni, csak miutan alaposan megneztem a kodot, akkor jottem ra.

-cs-
Sanyi

prometheus_X 2009.06.19. 02:22:47

@carstep: Köszi a tippet, mindjárt megvizsgálom.

Viszont ha nem veszed sértésnek, az Array.getUniques()-ot nem tartom jónak. Ha lefordítjuk az Array.getUniques-ot, azt jelentené, hogy a függvény térjen vissza az egyedi elemekkel, ami egy [1, 2, 3, 2, 3, 4] elemekből álló tömb esetén az [1, 4] kimenetet kéne hogy adja.

Ha elszakadunk az egyébként tényleg helytelen (maximum kényelmes, megszokott - kinek mi) elnevezéstől, akkor a fentit a legszerencsésebb lenne hívni getDistinct-nek, vagy getDistinctItems-nek. Uniques-nek is lehet hívni, de akkor magán az objektumon kéne a műveletet elvégeznie.

Magyarázat:
Egy objektum nem más, mint tulajdonságok és metódusok halmaza. Amikor azt írom, hogy:
- O.add(x)
Akkor O halmaz "add" nevű elemére hivatkozom. A JS ebben egész izmosan tartja a halmazos konvenciót is, hiszen a fenti leírható úgy is, hogy:
- O['add'](x)

Egy funkcionális nyelvben a fenti úgy festene, hogy: add(O, x).

O.add(x) ezért azt jelenti, hogy `O halmaz "add" nevű elemének végrehajtása x-szel`, míg add(O, x) azt jelenti: `add függvény értelmezése O-n és x-en`.

Így `O halmaz "egyediesítés" nevű elemének végrehajtása`: O.unique-ként írandó akkor, ha a műveletet O saját magán végzi el. Ugyanígy helyes ha azt mondom: "egyediesítés függvény értelmezése O-n", azaz unique(O).

Az O.getDistinct() helyesebb O.unique-nál, mert O.getDistinct nem saját magán végezi a műveletet, hanem visszatér egy új példánnyal - fordításban pedig: O halmaz "add vissza a különbözőeket" nevű elemének végrehajtása.

Array.unique feltehetően a PHP-ből terjedt el, és hát sajnos a PHP finoman szólva sem arról híres, hogy a függvényei konzekvensen, a megfelelő konvenciók szerint vannak (voltak, lettek) elnevezve és/vagy paraméterezve. Mivel a PHP-t elég sokan ismerik, így nekik az Array.unique teljesen egyértelmű, hogy mit csinál. Aki más nyelvből látja, tény hogy a haját tépi - joggal, bár talán némi túlzással.

prometheus_X 2009.06.19. 05:12:47

Merő véletlenségből egyikőtök munkahelyén nem keresnek esetleg friss munkaerőt? Épp állást keresek - bp-n - ha valaki hallott volna ilyesmit, írjatok légyszi a "csaba pont dobai kuk@c gmail pont com"-ra.

carstep 2009.06.19. 13:39:57

@prometheus_X: a getDistincts -l teljes mertekben egyetertek, az SQL nyelvet figyelembe veve tenyleg helyesebb, de unique PHP-bol valo leszarmazasat nem igazan ertem. Bar en inkabb php-zom, de ott meg nem talalkoztam ezzel :), lehet nem volt meg ra szuksegem

en sajna londonban vagyok igy nem igazan tudok segiteni. de ha valamit latok szolok.

-cs-
Sanyi

prometheus_X 2009.06.19. 21:21:00

@carstep: PHP-ban array_unique()-nak hívják a függvényt.

Munkával kapcsolatban köszi a választ mindenképp. Ha egy picit egyenesbe szedtem magamat, lehet hogy én is tiplizek ebből az országnak nevezett izéből :D van angliában 3 jóbarátom is szerencsére.

prometheus_X 2009.06.26. 12:12:29

Készítettem egy igen jól sikerült checkbox komponenst az eredeti Ext-es helyett. Azon túl, hogy kompatibilis az eredetivel is rengeteg új plusz funkciója van, például használható úgy is hogy mindenképp küldjön értéket a szervernek.

Mivel nekem elég égető volt a hiánya egy ilyen megvalósításnak, gondoltam másnak is hasznos lehet, itt a link hozzá: extjs.com/forum/showthread.php?t=72504

carstep 2009.07.02. 11:44:06

@prometheus_X: csak 3-as ala keszitetted, vagy mukodni vogy 2.0.2-ssel is

-cs-
Sanyi

prometheus_X 2009.07.07. 12:02:04

@carstep: Nem teszteltem 2.x-en de elképzelhető, hogy működik. Én egy erősen patch-elt 3.0 RC1.1-et használok, a 2-es Ext-et az 3.0 RC1 megjelenésekor száműztem :)

ExtJS blog, mi ez?

Az ExtJS egy JavaScript keretrendszer, melyet a blog írója elfogultan a legjobbnak tart, és ez a blog olyan apróságok gyűjteménye, melyek ExtJS használata közben felmerültek, eszébe jutottak...

Címkék

ajax (4) alignto (1) állás (3) analytics (1) anchorto (1) android (4) animate (2) array (9) auto (1) back button (1) beautifier (1) beforeevent (1) benchmark (1) blur (1) budapest.js (1) button (1) canvas (1) capture (1) case sensitive (1) center (1) change (1) cikkajánló (1) class (2) closure compiler (1) collapse (1) combobox (3) comment (1) console.log (2) contextmenu (2) core (2) count (1) css (15) csv (1) dataview (1) date (4) datefield (3) datepicker (1) debug (1) doksi (1) dragdrop (1) easing (1) eclipse (1) editor (1) element (5) error (5) eval (2) event (1) fejtörő (1) field (2) fieldset (1) filter (1) firefox (4) firefox extension (2) focus (3) fonts (1) fun (1) function (1) google (2) google chrome (1) grayscale (1) grid (4) group contact (1) header (3) height (2) hidden (1) hirek (2) history (1) htaccess (1) html5 (2) htmleditor (2) https (1) icon (3) id (2) ie (2) ie6 (1) ie9 (1) iframe (3) image (2) indexof (1) javascript (1) jquery (2) jslint (2) jsmin (1) json (7) keymap (1) kipróbálom (2) könyvajánló (2) label (1) layout (1) lint (1) log (1) loop (1) magyar (2) mandelbrot (1) mask (1) math (1) maxlength (1) mistake (1) mysql (5) napi szívás (16) nem extjs (12) node (1) nth child (1) number (1) off (5) offline (1) operator (1) override (20) pagesize (1) paging (2) panel (2) php (7) picker (1) plugin (3) pozicionálás (2) preload (1) print (1) propertygrid (1) pseudo (3) readonly (2) record (1) regexp (1) replace (1) resizable (1) rotate (1) round (1) scale (1) sencha touch (2) server (1) shuffle (1) slider (1) sort (3) sortable (1) store (2) string (7) sum (1) tabchange (1) tabpanel (1) tab key (2) tdd (1) template (1) textarea (2) textfield (1) textitem (1) theme (2) throw (1) timer (1) timestamp (1) title (2) toggle (1) toolbar (6) tools (1) total count (1) transparent (1) tree (1) treenode (1) trigger (1) truncate (1) try (1) ucfirst (1) undefined (2) unique (1) unload (1) urlencode (1) utf8 (2) verzió (1) video (1) viewer (1) viewport (2) visible (2) vtype (1) window (2) xtype (1) zindex (2)

Extjs.blog.hu - RSS

Kérdés?