僕がよければよいだけのメモ張
iframeに再帰的に処理したい
(x=>{
let opr=d=>{/*documentに対するなんらかの処理*/};
let f=d=>{Array.from(d.querySelectorAll("iframe"),i=>f(i.contentDocument));opr(d);};
f(x);
})(top.document);
Object / Array 全体の値の複製を作る
dest = eval('(' + JSON.stringify(src) + ')');
dest = JSON.parse(JSON.stringify(src));
JSON.stringify(src)
でObject値をJSON文字列にする。
これをeval
とかJSON.parse
に食わせて、新しい値として生みなおす。
JSON.parse
は、引数が厳密なJSONじゃないとダメなので、
予めstringify
した値を切り貼りした結果を使いたいときとかに、
JSON的な構文エラーがあったりすると通らなくて不便かも。
eval
なら、「JSON的にはアウトだけど、JavaScript上のObjectの宣言としては許される」書き方(*)が許される。
(リスト末尾のカンマとか、Objectのkeyを文字列にしないとか)
ただし、eval('{/*なかみ*/}')
のように、値になる式でないものを指定すると、実行できないエラーになるので、値にするためにeval('({/*なかみ*/})')
つまりeval('('+'{/*なかみ*/}'+')')
にする。
配列を複数の文字列要素で並べ替えする
key1=src.map(v=>v[accessor1]).sort().reduce((p,v,i)=>Object.assign(p,{[v]:i}),{});
src.sort((a,b)=>key1[a[accessor1]]-key1[b[accessor1]]);
key1=src.map(v=>v[accessor1]/*並べ替えするデータソースを指定*/).
sort(/*別途並べ替え方法に指定があれば指定*/).
reduce((p,v,i)=>Object.assign(p,{[v]:i}/*データソースに対して並び順を記録。一意に取得できるように、accesor1と合わせて調整する*/),{});
src.sort((a,b)=>key1[a[accessor1]]-key1[b[accessor1]])/*昇順/降順を切り替えるならaとbを逆にする*/;
複数条件指定は下記
key1=src.map(v=>v[accessor1]).sort().reduce((p,v,i)=>Object.assign(p,{[v]:i}),{});
key2=src.map(v=>v[accessor2]).sort().reduce((p,v,i)=>Object.assign(p,{[v]:i}),{});
src.sort((a,b)=>(key1[a[accessor1]]-key1[b[accessor1]])||(key2[a[accessor2]]-key2[b[accessor2]]));
3行目は以下と同じ
src.sort((a,b) => {
return (key1[a[accessor1]]-key1[b[accessor1]]) ||
(key2[a[accessor2]]-key2[b[accessor2]]);
});
// or 演算子は短絡評価のため、
// key1 による順序照会で0でない値になった(=並び順が確定した)らそれが return される
// (引数の2値は、key1 による並び替えで順位が異なるため、これに従い並び替え)
// 確定しない(つまり0)の場合、演算子(||)の右の式が評価され、その値が return される。
// (引数の2値は、key1 による並び替えで同順位だったため、 key2 による並び替えを行う)
すなわち、 order by accessor1, accessor2
みたいなことになる。
yyyy/mm/dd hh:mi:ss
形式の日時文字列を得る
古いverの環境では動かない(htaとか)
new Date().toLocaleString({},{dateStyle:'medium', timeStyle:'medium'})
dateStyle
だけ書けば日付のみに、timeStyle
だけ書けば時刻のみになる。
locale
が日本の前提の記述なので、日本の書式がいいよってどこかに書かないと、国が変わると見た目が変わる。
(「locale
毎に定義されたStyle:midium のときの書式
」になる)