No.1ベストアンサー
- 回答日時:
こんにちは
「オブジェクト配列」と言っているのは
[ { x:10, y:10 }, { x:50, y:50 }, ・・・]
のような構造の配列として解釈しました。
方法はいろいろと考えられると思いますので、以下は一例です。
>任意の式で評価して、その評価値が最大のオブジェクトを返す関数
任意の式を引数として渡すようにしておけば良いと思いますが、評価式の中で使用する係数などをどのように参照するかのルールが必要そうに思います。
共通のスコープの変数にしてしまえば簡単ですが、ちょっと気持ち悪いので・・・
以下では、係数等も引数にすることにして、評価式には this値として渡す方式をとっています。
係数等が複数の場合も考慮して配列にしていますので、評価式からの参照が少し面倒ですけれど。
また、最大値のオブジェクトが複数存在する場合もあるので、戻り値も同じ構造の配列にしています。
const SelectMax = (o, f, ...p) => {
const v = o.map(f, p), x = Math.max(...v);
return v.map((e, i) => [e, i]).filter( e => e[0] == x).map( e => obj[e[1]]);
};
>なるべく短いコードで書くにはどうすればよいですか。
一般化の度合いを減じたり、パラメータは共通スコープにするなどとすれば、少しは短くすることが可能と思います。
※ 関数の妥当性やオブジェクトの値が計算可能であることなどのチェックは一切行っていませんので、妙な値や妙な関数を与えればエラーになる可能性があります。
◆実行例
const obj = [
{name: "hoge", x:10, y:10 },
{name: "fuga", x:10, y:5 },
{name: "piyo", x:20, y:50 },
{name:"pesha", x:30, y:10 },
{name:"gutya", x:50, y:20 }
];
const p = {x:0, y:0};
const func = function(e) {return (this[0].x - e.x)**2 + (this[0].y - e.y)**2; }
console.log( SelectMax( obj, func, p) );
//結果: [ {name: 'piyo', x: 20, y: 50}, {name: 'gutya', x: 50, y: 20} ]
※ 定点p(0, 0)からの距離が一番遠い点を求めていますが、同じ距離の点が2か所返されます。
なるほど戻り値が複数になる事を考慮していませんでした。
よって、そのような組み込みの関数が用意されていないのも納得です。
相対的な距離が分かれば良いのでMath.sqrt()は不要でしたね。
これは盲点でして、コードの簡略化に直結するのでうれしいです。
No.2
- 回答日時:
var f = (p,c) => (任意式(p)<任意式(c))? c: p;
var 評価値が最大のオブジェ = オブジェ配列.reduce(f);
参考)
https://developer.mozilla.org/ja/docs/Web/JavaSc …
ありがとうございます。
maxやminのようなお手軽な関数は用意されておらず、あくまで比較用のコードを自分で書く必要がある事が分かりました。
満足です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP クラス 1 2022/08/08 15:12
- JavaScript オブジェクトから任意のプロパティを全て抽出する一番簡単な方法 1 2023/08/09 21:13
- その他(プログラミング・Web制作) Pythonのオブジェクトの関数について 2 2023/05/11 19:15
- PowerPoint(パワーポイント) パワーポイントのアニメーションについて 4 2023/06/14 16:25
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- Illustrator(イラストレーター) ワード。グラデーションがうまく行かない。 2 2022/09/28 19:56
- Visual Basic(VBA) 配列にしたセル範囲でのコメントがあるかどうかを取得するコードの書き方 2 2022/09/17 05:09
- Illustrator(イラストレーター) Illustratorでオブジェクトの色が勝手に変わって困っています。 4 2022/09/04 18:47
- Microsoft ASP プログラミング関係で質問です。 3 2022/10/11 16:06
- Excel(エクセル) テキストの背後にあるオブジェクトとは 3 2023/01/03 20:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
インラインフレームがときどき...
-
時間帯判定をする。
-
Excel VBA : イコールになら...
-
Setステートメントの使い方につ...
-
LISTBOXの内容が更新されま...
-
ビジュアルC++でボタンの有...
-
多人数のじゃんけんプログラム
-
シーケンス図のライフラインと...
-
開始日(Date型)から終了日(Date...
-
SQLException
-
StringBuilderのマルチスレッド
-
JqueryとPrototypeの比較
-
エクセルでオブジェクト内の文...
-
ワイルドカード<?>と型パラメー...
-
Flashのフェードイン/フェード...
-
JAVAからHTMLへ値を返す方法
-
オブジェクト指向の間違いと改...
-
vb.net オブジェクト指向につい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
ワイルドカード<?>と型パラメー...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
LISTBOXの内容が更新されま...
-
Object型からDouble型へのキャスト
-
JAVAからHTMLへ値を返す方法
-
COMコンポーネントって何?
-
ビジュアルC++でボタンの有...
-
戻り値がクラスオブジェクト
-
VBA 同じ名前のオブジェクトを...
-
ASP.net 教えてください!!(...
-
Vbで通常使用するプリンターを...
-
newは明示的にした方が良いのか?
-
CoCreateInstanceでエラーになる。
-
オブジェクトレベルとメタレベル
-
bmp画像をjpegやpng画像に圧縮...
-
Accessの連結・非連結オブジェ...
おすすめ情報