javascriptのarray.sort()メソッドを拡張して別のパラメータを受け付ける方法はありますか?
2023-10-21 02:36:43
質問
オブジェクトの配列をソートしようとしています。各属性のカスタムソートメソッドを書かないほうがいいと思うのですが。
どうにかして、組み込みの
array.sort()
メソッドを拡張して、ソートする属性を記述する追加パラメータを 受け付けることはできますか?例えば
array.sort(function(a, b, attr) { return a.attr - b.attr; }, 'name');
どのように解決するのですか?
プロパティ名を受け付けるファンクションジェネレータを書きましょう。
function propComparator(prop) {
return function(a, b) {
return a[prop] - b[prop];
}
}
arr.sort(propComparator('name'));
また、ソーターを後で使うために、直接、またはパラメーターとして保存することができます。
var compareNames = propComparator('name');
var compareFoos = propComparator('foo');
...
arr.sort(compareNames);
takesComparator(compareFoos);
ES6用に更新し、異なる型でも実際に動作するようにしました。
注意点として
sort
はインプレースでソートすることに注意してください。
const arr = [
{ name: 'John', age: 92 },
{ name: 'Dave', age: 42 },
{ name: 'Justin', age: 3 }
]
const propComparator = (propName) =>
(a, b) => a[propName] == b[propName] ? 0 : a[propName] < b[propName] ? -1 : 1
arr.sort(propComparator('name'))
console.log("By name", arr)
arr.sort(propComparator('age'))
console.log("By age", arr)
関連
-
[解決済み] ソートされた数値の配列に数値を挿入する効率的な方法?
-
[解決済み] 新しい配列を作成せずに、既存のJavaScript配列を別の配列で拡張する方法
-
[解決済み】一部のHTMLタグに任意のデータを格納する方法
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] 上級者向けJavaScript。この関数はなぜ括弧でくくられるのですか?重複
-
[解決済み] jqueryでdivの要素がオーバーフローしていないかチェックする
-
[解決済み] 文字列とラベルのローカライズとグローバリゼーションのベストプラクティス【終了しました
-
[解決済み] JavaScriptデータフォーマット/プリティプリンタ
-
[解決済み] Javascriptの.filter()メソッドでコールバック関数に追加パラメータを渡すにはどうすればよいですか?
-
[解決済み] Javascriptのソート機能です。1番目でソートし、2番目でソートします。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScript で範囲を作成する - 奇妙な構文
-
[解決済み] jqueryでdivの要素がオーバーフローしていないかチェックする
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] JSXとLoadshを使用して、ある要素をn回繰り返す方法
-
[解決済み] JavaScriptで文字列を数値に変換する最速の方法は何ですか?
-
[解決済み] CORS: 認証モードは 'include' です。
-
[解決済み] jQueryを使用して、すべてのクリックイベントハンドラを削除するにはどうすればよいですか?
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?
-
[解決済み] null 値が常に最後に来るように配列を並べ替える