👍

[JavaScript]someメソッドを使って配列をチェックする

2021/01/29に公開1

やりたいこと

  • 特定の商品名がふくまれるかどうかを判定する関数を実装したい
  • 特定の商品名は複数指定することができる(配列で持つ)
  • 判定対象となる商品は複数ある
  • 関数型っぽい書き方を身につけたいのでなるべくfor文を使わずにやりたい。

some()の概要

some() メソッドは、配列の少なくとも一つの要素が、指定された関数で実装されたテストに合格するかどうかをテストします。これはブール値を返します。

arr.some(callback関数)の形で使う。配列の各要素に対してcallback関数を実行し、その結果がtrueになる要素がみつかればtrueを返すメソッド。

サンプル

  • 商品名を渡すと、特定の商品名配列TARGET_GOODS_NAMESに渡した商品名が含まれるかどうかを判定してbooleanを返す関数を作成しています。
sample.transform
const TARGET_GOODS_NAMES = [
  '鬼滅の刃',
  'シャングリラ・フロンティア',
  '呪術廻戦',
  '無職転生',
  '独学大全',
];

const items = [
  { goodsName: '呪術廻戦 1巻' },
  { goodsName: '鬼滅の刃 3巻' },
  { goodsName: '独学' },
  { goodsName: '対象外商品1' },
];

const isTargetItem = (goodsName: string): boolean => {
  if (TARGET_GOODS_NAMES.some((word) => goodsName.includes(word))) {
    return true;
  }
  return false;
};

items.forEach((item) => {
  console.log(isTargetItem(item.goodsName));
});

実行結果

$ ts-node src/test.ts
true #「呪術廻戦 1巻」には「呪術廻戦」が含まれるのでtrue
true #「鬼滅の刃 3巻」には「鬼滅の刃」が含まれるのでtrue
false #「独学」はTARGET_GOODS_NAMEの中に含まれるものがないのでfalse
false #「対象外商品1」はTARGET_GOODS_NAMEの中に含まれるものがないのでfalse

ポイント

  • TARGET_GOODS_NAMESから要素を1つずつ取り出す(wordに格納される)
  • 引数で渡したgoodsNamewordの中に含まれるかどうかをincludesを使ってチェック
  • goodsNameの中にTARGET_GOODS_NAMESが含まれるものが1つでもあれば、some()はtrueを返す ※実行結果コメント参照

参考

Discussion

nap5nap5

someとincludesをbennyで見比べてみました。

import { default as b } from 'benny'

const input = Array.from({ length: 1_000_000 }, (_, i) => i)

b.suite(
  'Some & Includes',

  b.add('some', () => {
    input.some(d => d === 37458)
  }),

  b.add('includes', () => {
    input.includes(37458)
  }),

  b.cycle(),
  b.complete(),
  b.save({ file: 'Some & Includes', version: '1.0.0' }),
  b.save({ file: 'Some & Includes', format: 'chart.html' }),
)

demo code.
https://codesandbox.io/p/sandbox/sleepy-cray-hsvpqk?file=/src/bench.ts:1,1

簡単ですが、以上です。