JavaScript:配列に関する四つの面接問題


バックエンドが既知のオブジェクト配列に戻ります.フォーマットは同様です.
const arr = [
  { id: 1, name: 'a', birth: 896630400000 },
  { id: 2, name: 'b', birth: 725817600000 },
  ...,
]
要求通りにコードを書く:
  • は、name属性の降順に並べられています.(大文字から小文字まで)
  • は、ID属性の同じ要素を除去する(重複が発生した場合、後に出現するカバーが先に現れた場合、元の順序を保持する必要はない)
  • .
  • で95を全てフィルタリングした後(birth)=1995年1月1日)
  • どうやってフロントエンドのページを作りますか?
  • 会社はビッグデータ処理業務なので、配列関連の操作はまだ頻繁に行われています.これは私達の会社の前端のJS面接問題の中のプログラミング問題の部分です.基本ですが、答えは多くないようです.次は順次分析します.
  • 答えを見る前に自分で試してみませんか?
  • 答えを見る前に自分で試してみませんか?
  • 答えを見る前に自分で試してみませんか?
  • 答えを見る前に自分で試してみませんか?
  • 答えを見る前に自分で試してみませんか?
  • 答えを見る前に自分で試してみませんか?
  • 答えを見る前に自分で試してみませんか?
  • 答えを見る前に自分で試してみませんか?
  • 答えを見る前に自分で試してみませんか?
  • 答えを見る前に自分で試してみませんか?
  • 答えを見る前に自分で試してみませんか?
    配列の並べ替え
  • は、name属性の降順に並べられています.(大文字から小文字まで)
  • 並べ替えを見ると、もちろんAray((zhi sort)を連想することができる.みんな[1, 3, 2].sort((a, b) => a - b)と書いていますが、この配列はちょっと特殊で、対象配列です.並べ替え規則も特殊なものがあります.文字列に従って並べ替えられ、そして降順に並べ替えられます.
    ポイント:
  • Aray((zhi sort)
  • String菵localComppare
  • Array#sortこれは間違いないです.アルゴリズムを手書きで並べ替える人は、すべて消去されます.難点は、sortのコールバック関数で文字列のサイズをどう比較するかにある.最初の文字列の減算は正しくありません.'a'-'b'の表現に対して、JSエンジンはまず文字列'a''b'を数字に変換します.そして:
    +'a' // => NaN
    +'b' // => NaN
    'a' - 'b' = NaN - NaN = NaN
    一部の学生は、文字コードを比較する方法を提案します.これはいいですが、文字列の長さが固定されていないことを知っています.前の方が同等で次の方がいいと判断しなければなりません.循環を導入しなければなりません.これは面接官が欲しい答えではありません.
    文字列は減算してはいけませんが、文字列はサイズより小さいものを使ってもいいし、比較は辞書の順序で順次比較します.
    'a' < 'b' // true
    'a' < 'a' // false
    'aa' < 'ab' // true
    比較演算子を使って文字列を比較する問題は、一度に彼らの正確な関係を得ることができないということです.a < bfalseに戻るなら、もう一つはaがbに等しく、もう一つはaがbより大きいかもしれない.したがって、比較演算子を使用すると、sortのコールバック関数で2回判断しなければなりません.
    arr.sort((a, b) => a.name < b.name ? 1 : a.name > b.name ? -1 : 0); //      
    最適なスキームは、String#localeCompareを使用して、この関数は、一度に正負ゼロに戻り、完全にArray#sortに適用される.
    arr.sort((a, b) => b.name.localeCompare(a.name)); //   ,   b   a   
    配列
  • は、ID属性の同じ要素を除去する(重複が発生した場合、後に出現するカバーが先に現れた場合、元の順序を保持する必要はない)
  • .
    ネットで面接問題を見たことがある人は、配列が重くなるとすぐにSetを連想します.これは配列を作るのに使います.友達がいないほどかっこいいです.
    [...new Set([1, 1, 2, 3, 3, 1])] // => [1, 2, 3]
    しかし、この問題はコースによって牌を出さないです.重いのは対象配列で、単純な数字配列ではありません.
    この問題に遭遇した時は、フィールドidによって重いというテーマがありますが、idは単独で処理しなければなりません.しかし、idは、id自体に行くのではなく、idに関連するオブジェクトに行くのであれば、idをオブジェクトにマッピングする必要があるに違いない.このレイヤーをマッピングすると、オブジェクトとMapを連想しやすくなります.
    ポイント:
  • オブジェクトkeyの一意性
  • Map
  • もし相手を使うならば、少し愚かな話はこのようにすることができます.
    const map = {};
    const resultArr = [];
    
    arr.forEach(x => {
      if (!map[x]) {
        map[x] = true;
        resultArr.push(x);
      }
    }
    このような書き方は問題設定の要求に完全に一致していないので、いつも最初に現れた値を残します.保持する場合は、配列を反転させてから巡回します.
    arr.concat().reverse().forEach(...) // reverse        ,           
    ここではreduceRightというクラスメイトがいるかもしれません.ここでは、コールバック関数が純粋な関数であると保証できないなら、mapやreduceを使わないでください.
    もう一つの方法は、常に後のオブジェクトで前をカバーすることです.
    const map = {};
    arr.forEach(x => {
      map[x] = x;
    }
    
    const resultArr = [];
    for (let key in map) {
      //     ,     hasOwnProperty          key
      resultArr.push(map[key]);
    }
    二つのステップに分けて、前のステップには行列をオブジェクトに変換するようなものがあり、後のステップにはオブジェクト内のすべての値が取られます.前者はObject菷assignまたはObject荃from Entiesで代替でき、後者はObject玣valuesである.簡潔な書き方はこうです.
    Object.values(Object.assign(...arr.map(x => ({ [x.id]: x }))));
    オブジェクトは完全な解決策ではありません.オブジェクトのkeyは文字列に強制的に変換されます.タイトルのidはすべてデジタルタイプですが、後に文字列の数字が現れるとは保証できません.完璧な解決策はSetの同胞兄弟Mapです.
    [...new Map(arr.map(x => [x.id, x])).values()] //    Map#values               ,         
    配列フィルタ
  • で95を全てフィルタリングした後(birth)=1995年1月1日)
  • ポイント:
  • Aray钾filter
  • Date
  • この問題は明らかに前の2つの問題よりずっと簡単ですが、この問題は完全に正解した人が少なくて、日付の相手の使い方に問題があります.
    前の記事で、Dateオブジェクトのピットについて話しました.デジタル年月日を使って、Dateオブジェクトを作った時、月は0から始まったと覚えています.Dateオブジェクトを文字列で構成する場合は、タイバー(/)を使ってタイムゾーンの問題が発生しないようにしてください.
    arr.filter(x => x.birth >= new Date(1995, 0, 1);
    前の改ページ
  • どうやってフロントエンドのページを作りますか?
  • ポイント:
  • アラリカース
  • ページの基本概念
  • 「改ページ」とは、配列の中から表示する部分を切り取ってページに表示し、切り取りはsliceですが、多くの人がsliceとspliceを混ぜているようです.
    sliceは切り取り配列の一部ですが、元の配列を変えず、二つのパラメータは下付きです.spliceは切り取り配列としても使用できますが、spliceは元の配列を変えます.そしてspliceが要求する第二のパラメータは切り取り項目の長さです.sliceは切り取り配列であり、spliceは一般に配列の中央に挿入削除操作として用いられる.
    sliceとspliceは、同じ文字pが違っています.使い方の意味は大きく違います.
    const from = (   - 1) *     ;
    arr.slice(from, from +     );
    終了
    配列オブジェクトにはたくさんのオリジナル方法があります。、配列操作はJSデータ操作で最も一般的な操作で、よく復習しても大丈夫です.