Kanasan.js サイ読#6

雨が止むのを待って出かけたため昼から参加。ヘタレすぎる。

"name" of img/applet

知らなかった。レガシーDOMって残しとく意味無さそう。

sorting algorithms

Rhinoがわざわざヒープソートを実装してる*1のは SM-C からそのまま持ってきたからだろか。実装別の表を作ろうかと一瞬だけ考えたが面倒な上 nanto さんと被りそうなので自粛。

via Lingr

outerHTMLなんてあったのか firefoxに無いから使う事は無さそうだけど

IEしか知らなかった頃に重宝していた覚えが。

elm.parentNode.replaceChild(document.createElement('br'), elm);
/* ↓ */
elm.outerHTML = '<br/>';

DOM が不便過ぎるだけとも言う。

そうなると、sort_byのようなmethodがほしくなりますねぇ。

Array.sortBy = (function(cmp, I){ return function sortBy(arr, fun){
    var sorter = [], fun = fun || I, i = arr.length, j = i;
    if(i !== Math.ceil(Math.abs(i))) throw new TypeError('Not Array-like.');
    while(i--) sorter[i] = {key: fun(arr[i], i, arr), val: arr[i]};
    sorter.sort(cmp);
    while(j--) sorter[j] = sorter[j].val;
    return sorter;
}}(function(a, b){ return a.key < b.key ? -1 : +(a.key > b.key) },
   function(x){ return x }));

こんなでも prototype.js のよりはマシか。p337 15-5 を書き換えてみる。

<ul id='list'><li>one</li><li>two</li><li>three</li><li>four</li></ul>
<script src='sortBy.js'></script>
<script><!--
function sortKids(e){
  if(typeof e === 'string') e = document.getElementById(e);
  var es = Array.sortBy(e.childNodes, function(x){ return x.innerHTML });
  for(var l = es.length, i = -1; ++i < l;) e.appendChild(es[i]);
}
sortKids('list');
--></script>
?

*1:最新版でもヒプソのまま ftp://ftp.mozilla.org/pub/mozilla.org/js/