🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

406閲覧

JSでオブジェクトの範囲でValueを合計したい。

masa_engin

総合スコア15

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/11/28 14:18

JSでオブジェクトのキーの範囲でValueを合計したい。

JS

1const obj = { 2 1: 1, 3 3: 2, 4 10: 1, 5 12: 3, 6 20: 4, 7 30: 1, 8 40 : 3, 9 45 : 8, 10 50: 3, 11 60: 8, 12 73: 6, 13 89: 2, 14 90: 3, 15 100: 9, 16 101: 1 17}

このような配列から

JS

1result = { 2 '1-10': 4, 3 '11-20': 7, 4 '21-30': 1, 5 '31-40': 1, 6 '41-50': 11, 7 '51-60': 8, 8 '61-70': 0, 9 '71-80': 6, 10 '81-90': 3, 11 '91-100': 9, 12 '100-': 1, 13}

このような結果を得たいのですが、どのようなアルゴリズムを組めば良い
かわかりません。
アルゴリズムに詳しい方がいらっしゃいましたら、教えてください。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のような理由から、質問の回答に至るアルゴリズムは質問者様以外には実装不能だと思います。

  • result の '31-40': 1, は obj 40 : 3, の 3 を 1 と評価しており、変換根拠が分からない(obj の 10,50,60,90,100 が一貫して 1/3 と評価されたり 12,50,90 にも出現する値 3 が一貫して 1 に評価されたりしているようには伺えないため、40 と 3 の組み合わせで 1 になる特殊ルールがあると想定される)
  • result の '81-90': 3, は obj 89: 2, 90: 3, の合計としては合わず、3 にも出現する値 2 が一貫して無視されたり、 10,40,50,60,100 が一貫して 1/3 と評価されたりしているようには伺えないため、89: 2, 90: 3, を 3 とする特殊ルールがあると想定される)
  • result の '100-': 1, は obj 100: 9, 101: 1 の合計としては合わず、100: 9, 101: 1 を 1 とする特殊ルールがあると想定される)

参考として、結果が異なってしまうが「オブジェクトのキーの範囲でValueを合計したい」は下記のように実装できる。

javascript

1const obj = { 2 1: 1, 3 3: 2, 4 10: 1, 5 12: 3, 6 20: 4, 7 30: 1, 8 40 : 3, 9 45 : 8, 10 50: 3, 11 60: 8, 12 73: 6, 13 89: 2, 14 90: 3, 15 100: 9, 16 101: 1 17} 18const buildJudger = (s) => { 19 const opt = s.split("-"); 20 if(opt.length !== 2 || (opt[0] === "" && opt[1] === "")) return () => false; 21 const [first, second] = opt.map(Number); 22 if(opt[0] === "") return (a) => a <= second; 23 if(opt[1] === "") return (a) => first <= a; 24 return (a) => first <= a && a <= second; 25} 26const pivots = ['1-10', '11-20', '21-30', '31-40', '41-50', '51-60', '61-70', '71-80', '81-90', '91-100', '100-',]; 27const result = pivots.reduce((a,c)=>{ 28 const f = buildJudger(c); 29 const sum = Object.entries(obj).reduce((a,c)=> f(Number(c[0])) ? a+c[1] : a ,0); 30 return {...a,[c]:sum}; 31},{});

このとき result は↓こうなります。

javascript

1{ 2"1-10": 4,3"11-20": 7,4"21-30": 1,5"31-40": 3,6"41-50": 11,7"51-60": 8,8"61-70": 0,9"71-80": 6,10"81-90": 5,11"91-100": 9, 12"100-": 10, 13}

投稿2020/11/29 11:16

編集2020/11/29 11:17
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masa_engin

2020/11/29 12:36

合計値を間違えて記載してしまって、申し訳ございません。 助かりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問