0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JavaScriptで配列をインデックス付きで逆順でループする

Last updated at Posted at 2020-10-16

以前「Google Apps Scriptでの業界ニュース通知を社内で運用した話」に書いた通り、GoogleAppScriptを使って業界ニュースを通知しています。

簡単に言うと、「SpreadSheetにあるURLをクローリングして、新しいニュースがあれば通知し、通知済みのニュースを別のシートに書き出す」ような仕様です。他のシートの同じ行に書き出すため、次のようなコードで実装されています。

/**
 * 処理を実行する。
 * @throw クローリングで1つ以上エラーが発生した場合
 */ 
function myFunction() {
  var parsers = createParsers();
  var errors = [];
  readConfig().forEach(function(config, i) {
    if (config['skip']) return;
    try {
      var latest_news = fetchLatestNews(config['title'],
         parsers[config['parser']], [config['feed']], config['charset'], i + 1);
      postNews(latest_news, config);
    } catch (err) {
      errors.push(config["title"] + "のニュース通知で次のエラーが発生しました: " + new String(err));
    }
  });
  notifyErrors(errors);
}

ただし、これでは「先に追加したニュースソースほど先に通知される」ため、「(先に追加されたニュースソースのほうが重要度が高い傾向があるため)チャットを表示したときに重要度が低いニュースが表示されてしまう」という問題点がありました。そのためインデックスを含めて逆順にループする必要があり、reverseメソッドで配列を逆順にするだけでは対応できません。

こちらのstackoverflowによると、reduceRightというメソッドで逆順のイテレーションが可能なようです。

const array = ['alpha', 'beta', 'gamma'];
array.reduceRight((_, elem) => console.log(elem), null);

// この方法は、インデックスは逆順にならないことが利点
array.reduceRight((_, elem, i) => {
  console.log(elem);
  console.log(i);
}, null);

先程のコードは、次のようなコードに書き換えました。

/**
 * 処理を実行する。
 * @throw クローリングで1つ以上エラーが発生した場合
 */ 
function myFunction() {
  var parsers = createParsers();
  var errors = [];
  // 重要なニュースを後に通知するためreduceRightを使う
  readConfig().reduceRight(function(_, config, i) {
    if (config['skip']) return;
    try {
      var latest_news = fetchLatestNews(config['title'],
         parsers[config['parser']], [config['feed']], config['charset'], i + 1);
      postNews(latest_news, config);
    } catch (err) {
      errors.push(config["title"] + "のニュース通知で次のエラーが発生しました: " + new String(err));
    }
  }, null);
  notifyErrors(errors);
}

ちなみに、先程のコードでは、実装した当時は利用できなかったという理由で利用していませんが、GoogleAppScriptの現在の仕様ではconstやアロー関数は利用できます。積極的に使っていきましょう。

参考記事

0
0
1

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?