LoginSignup
0
0

JavaScriptチートシート

Last updated at Posted at 2023-09-27

僕がよければよいだけのメモ張

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 全体の値の複製を作る

src を dest にコピー
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 のときの書式」になる)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0