【react】reduceはオブジェクトでは使えない?

reduceの覚書です。

目次

reduceはオブジェクトでは使えない?

JavaScriptでは、reduce メソッドは配列のプロトタイプに属しているため、配列に対して直接使用できますが、オブジェクトに対しては直接使用することはできません。オブジェクトに reduce のような操作を行う場合は、オブジェクトのキー、値、またはエントリ(キーと値のペア)の配列を生成し、それに対して reduce を適用する必要があります。

reactの配列の初期化(reduce)

チェックボックスが配列の際に初期化する方法です。

const [ArrayState, setArrayState] = useState>(
  array.reduce((acc, curr) => ({ …acc, [curr]: false }), {})
);

reactのオブジェクトの初期化(reduceは使えない)

オブジェクトの場合、reduceは使えません。チェックボックスがオブジェクトの際に初期化する方法です。

const initializeObjsState = () => {
  const initialState = {};
  for (const obj in objs) {
    if (objs.hasOwnProperty(type)) {
      initialState[obj] = false;
    }
  }
  return initialState;
};

const [objState, setObjState] = useState<Record<string, boolean>>(
  initializeObjsState()
);

Math.max.applyではなく、reduceで最大値を取得

配列操作の場合はMath.max.applyを使うと融通が聞きにくいです。単純に最大値を取得するならいいのですが、最大値の名前を取得する場合など困ります。

const max = Math.max.apply(
  null,
  obj.map(function(o) {
    return o.value
  })
)

数字の最大値ではなく、最大値のキーワードが取得できます。

const maxKey = object.reduce((a, b) =>
  a.value > b.value ? a : b
).key

詳しくはこちらの記事が参考になります。

最大値の2番目、3番目を取り出すならソートするのが早そうです。

reduceは万能型であり、他にもいろいろなことができますよ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次