Closed13

ECMAScriptの便利そうなproposals

moshmosh

proposalsに興味を持ったきっかけのiterator helpers
https://github.com/tc39/proposal-iterator-helpers

JSでは [0, 1, 2].filter(n => n % 2 === 0).map(n => n * n) のように書くと、filtermap を呼び出す度に配列が作られるが、他の言語のように遅延評価で中間の配列を作らず map 等ができるようになる。

function* naturals() {
  let i = 0;
  while (true) {
    yield i;
    i += 1;
  }
}

const result = naturals()
  .map(value => {
    return value * value;
  });
result.next(); //  {value: 0, done: false};
result.next(); //  {value: 1, done: false};
result.next(); //  {value: 4, done: false};

コード例はリンク先から引用しています。
これより下のコメントについても同様にコード例はリンク先から引用しています。

moshmosh

関連して groupBy

https://github.com/tc39/proposal-array-grouping

const array = [1, 2, 3, 4, 5];

// `Object.groupBy` groups items by arbitrary key.
// In this case, we're grouping by even/odd keys
Object.groupBy(array, (num, index) => {
  return num % 2 === 0 ? 'even': 'odd';
});
// =>  { odd: [1, 3, 5], even: [2, 4] }

// `Map.groupBy` returns items in a Map, and is useful for grouping
// using an object key.
const odd  = { odd: true };
const even = { even: true };
Map.groupBy(array, (num, index) => {
  return num % 2 === 0 ? even: odd;
});
// =>  Map { {odd: true}: [1, 3, 5], {even: true}: [2, 4] }
moshmosh

Iterator.range

https://github.com/tc39/proposal-iterator.range

for (const i of Iterator.range(0n, 43n)) console.log(i) // 0n to 42n

Iterator.range(0, Infinity)
    .take(1000)
    .filter((x) => !(x % 3))
    .toArray()

function* even() {
    for (const i of Iterator.range(0, Infinity)) if (i % 2 === 0) yield i
}
;[...Iterator.range(1, 100, 2)] // odd number from 1 to 99

Pythonのrangeみたいなやつ

moshmosh

ライブラリを普段選ぶときは人気度や開発の活発さで選んでいるが、ユーティリティ系はESNextのpolyfillを選ぶという選択肢もあるのかも

proposalのstageがどの程度の安定度を表しているのか要確認

moshmosh

機能が似ているライブラリがproposals載っているのも嬉しい

たとえばrecordにはimmerが対応するライブラリとして挙げられている

moshmosh

Temporal

https://github.com/tc39/proposal-temporal

JSの Date はタイムゾーン情報を内部に保持しなかったりかなり厳しめなのだが、それを改善したもの
日付 (Temporal.PlainDate) やタイムゾーン込みの日時 (Temporal.ZonedDateTime) があり、かなりよさそう。他にもいろいろあるっぽい。

Dateからは以下のような手順で変換できそう?

Date→Instant→ZonedDateTime→PlainDate

moshmosh

Pipe Operator

https://github.com/tc39/proposal-pipeline-operator

こんな感じで処理の結果を次の処理の引数にすることができるようになる。

Object.keys(envars)
  .map(envar => `${envar}=${envars[envar]}`)
  .join(' ')
  |> `$ ${%}`
  |> chalk.dim(%, 'node', args.join(' '))
  |> console.log(%);

まさかみんな大好きPipeがproposalsにあるとは。

このスクラップは5ヶ月前にクローズされました