JavaScriptの入れ子関数


多くの人々がJavaScriptの入れ子関数について混乱し、なぜネストされた関数が有用であり、入れ子関数のユースケースは何ですか?私たちのコードやブログの記事や記事のような入れ子になった機能に遭遇する可能性が非常に多くの場所があります.
この記事では、入れ子になった関数が多くの点で有用である理由の基礎についてお話したいと思います.
私はいくつかの制約条件に沿っていくつかの基本的な質問をし始めます.以下のように従業員配列があると仮定しましょう
const employee = [
  { id: 1, name: "Raja", age: 28, status: "active" },
  { id: 2, name: "Andy", age: 32, status: "Inactive" },
  { id: 3, name: "Kumar", age: 45, status: "active" },
  { id: 4, name: "Charles", age: 35, status: "Inactive" },
];

使用ケース1


どのようにプロパティ(年齢、ステータスなど)で配列をソートするのですか?
制約:配列を他の関数へのリファレンスとして渡すことはできません.
典型的には、我々の事前のプログラミング知識で、配列を使ってソートを行います.プロトタイプ.以下のようなソート関数
function sortBy(array, propName) {
  return array.sort(function (a, b) {
    if (a[propName] > b[propName]) {
      return 1;
    } else if (a[propName] < b[propName]) {
      return -1;
    } else {
      return 0;
    }
  });
}

console.log(sortBy(employee, "age"));
console.log(sortBy(employee, "status"));
上記のコードはうまく仕事をしますが、最初のユースケースの最初の制約を見てください.それで、それは明らかにそれがする方法でないと言います.関数への配列リファレンスを渡します
一般的に、これはJavaScript
// How do to pass another arguments to tell sort based on which property of an object ???????
Array.prototype.sort(function(a, b)) 
我々が配列を知っているように.プロトタイプ.sortインターフェースは2つの引数を受け入れるだけです.さて、sortメソッドは2つのパラメータしか受け付けないことを理解しています.
では、どうやってその問題を解決しますか?
ヒント:配列に余分な引数を追加せずに、ソートコールバック関数内でカスタム引数をアクセスできます.プロトタイプ.ソート?

これは関数の中で関数(しばしば高次関数と呼ばれる)を使用するのに最適な瞬間です.したがって、ソートインターフェイス要件に従って2つの引数しか受け付けない関数を返すことができます.
SortBy機能の第2のバージョンは、ここにあります

function sortBy(propName) {
  return function (a, b) { // obeying sort interface function signature
    if (a[propName] > b[propName]) { // propName accessible from highorder function
      return 1;
    } else if (a[propName] < b[propName]) {
      return -1;
    } else {
      return 0;
    }
  };
}

console.log(employee.sort(sortBy("age")));
console.log(employee.sort(sortBy("status")));
フィルタユースケースを持つ高機能のもう一つのユースケースについて議論したい

ユースケース2


どのように、あなたは不活発な従業員と配列をフィルターに入れますか?
制約:すべてのアクティブな従業員(IsActiveExcel)機能が既に存在しているフィルタアウトのための機能があると仮定して、コード複製なしですべての非アクティブな従業員を得るために同じ機能を使用してください.
function isActiveEmployee(employee) {
    return employee.status == 'active';
}

const activeEmployee = employee.filter(isActiveEmployee);
// const inactiveEmployee = employee.filter(??????);
我々は何も考えずに簡単に解決策を考え出すかもしれない
function isInactiveEmployee(employee) {
     return employee.status !== 'active';
}

//(or)

 function isInactiveEmployee(employee) {
     return employee.status === 'inactive';
}
ちょうどuse case 2の制約の穏やかなリマインダー、それは言いました、我々はコードを複製しないでください、それで、我々はより良い方法をすることができますか?
したがって、我々はすでにすべてのアクティブな従業員を見つけるコードを考えているので、iSactiveEncoty関数の結果を反転させるために我々はすべての非アクティブな従業員を得ることができなくても、非アクティブな従業員をフィルタアウトするためのブランドの新しい機能を書くことなく.
メソッドのようです
 function negate(item){
     return !isActiveEmployee(item)
 }
しかし、我々はさらに良いことができる、我々は以下のように書くことができるようにユーティリティを関数としてnegateを考えるかもしれない
  function negate(predicate){
      return function() {
          return !predicate.apply(this, arguments)
      }
  }
ここではすべての非アクティブな従業員をろ過するためのソリューションです
const inactiveEmployee = employee.filter(negate(isActiveEmployee));

console.log({inactiveEmployee});

今すぐあなたのような高次機能の利点のいくつかを見ることができます
  • クリーナー抽象化
  • は、構成可能な機能と多くの
  • で働いています

    さらに読みます。


    https://eloquentjavascript.net/05_higher_order.html
    https://javascript.info/currying-partials