","datePublished":"2020-01-10T08:33:42.936Z","dateModified":"2020-01-10T08:51:43.252Z"},{"@type":"Comment","text":"残念ながら小数点の計算だと誤差が結構出ます","datePublished":"2020-01-10T08:49:25.882Z","dateModified":"2020-01-10T08:49:25.882Z"},{"@type":"Comment","text":"コメントへの返事が遅くなってしまい申し訳ございませんでした。。\r\nご回答者様が提示してくださったコードで勉強させていただいております。\r\nいろいろ調べながら、しっかり理解する事ができたら、実行してみようと思います。\r\nお忙しい中ご回答ありがとうございました。","datePublished":"2020-01-10T09:07:05.296Z","dateModified":"2020-01-10T09:07:05.296Z"},{"@type":"Comment","text":"codepenの方のサンプルでoffset位置やrangeを手動で切り替えて\r\n試してくださいねー","datePublished":"2020-01-10T09:15:40.678Z","dateModified":"2020-01-10T09:15:40.678Z"}]},{"@type":"Answer","text":"```javascript\r\nconst data = [\r\n \"sample1\",\r\n \"0.01\", \"0.02\", \"0.03\", \"0.04\", \"0.05\", \"0.06\", \"0.07\", \"0.08\", \"0.09\", \"0.1\",\r\n \"0.11\", \"0.12\", \"0.13\", \"0.14\", \"0.15\", \"0.16\", \"0.17\", \"0.18\", \"0.19\", \"0.2\",\r\n \"0.21\", \"0.22\", \"0.23\", \"0.24\", \"0.25\", \"0.26\", \"0.27\", \"0.28\", \"0.29\", \"0.3\",\r\n \"0.31\", \"0.32\", \"0.33\", \"0.34\", \"0.35\", \"0.36\", \"0.37\", \"0.38\", \"0.39\", \"0.4\",\r\n \"0.41\", \"0.42\", \"0.43\", \"0.44\", \"0.45\", \"0.46\", \"0.47\", \"0.48\", \"0.49\", \"0.5\",\r\n \"0.51\", \"0.52\"\r\n];\r\nconst split = (array, n) => array.reduce((a, c, i) => i == 0 ? [c] : i % n == 1 ? [...a, [c]] : [...a.slice(0, -1), \"\" + (+a[a.length - 1] + +c)], []);\r\nconst result = split(data, 10);\r\nconsole.log(result)\r\n```\r\n\r\n実行結果\r\n\r\n```\r\n[\r\n 'sample1', '0.55',\r\n '1.55', '2.55',\r\n '3.55', '4.55',\r\n '1.03'\r\n]\r\n```","dateModified":"2020-01-10T07:59:00.333Z","datePublished":"2020-01-10T07:55:45.242Z","upvoteCount":2,"url":"https://teratail.com/questions/234337#reply-341232","comment":[{"@type":"Comment","text":"お忙しい中ご回答ありがとうございます。\r\n参考にさせていただきます。","datePublished":"2020-01-10T08:43:50.303Z","dateModified":"2020-01-10T08:43:50.303Z"}]},{"@type":"Answer","text":"こんにちは\r\n\r\nこの回答では、10個ずつ区切るために、lodash の [_.chunk](https://lodash.com/docs/#chunk) を使います。\r\n\r\n前提として、ご質問にある\r\n\r\n> [\"sample1\", \"0.004\", \"0.003\", \"-0.0\", \"-0.004\", \"0.001\", \"-0.0\", \"-0.002\", \"0.002\", \"0.002\", \"0.002\", \"-0.003\", \"0.008\", \"0.011000000000000001\",・・・・]\r\n\r\nという形の配列は、 `data` という変数で与えられるものとします。\r\n\r\n\r\nまずはじめに、数値を要素とする配列`arr`を与えると、要素の合計を返す関数 `totalize(arr)` を作っておきます。これは以下のようになります。\r\n\r\n```javascript\r\nconst totalize = arr => (arr.reduce((sum, e) => sum + e));\r\n```\r\n\r\n次に、 `data` の2番目以降の要素である文字列を数値に変換した配列 `values` を、以下によって作ります。\r\n\r\n```javascript\r\nconst values = data.slice(1).map(e => +e);\r\n```\r\n\r\nlodash の [_.chunk](https://lodash.com/docs/#chunk) を使って、上記で得られた `values` の要素を10個ずつ区切った部分配列を要素とする配列を作り、その配列から、要素である各配列の合計値を要素とする配列`totals`を作ります。これは以下のようにすると得られます。\r\n\r\n```javascript\r\nconst totals = _.chunk(values, 10).map(totalize);\r\n```\r\n\r\n最後に、以下によって目的の配列 `result` が得られます。\r\n\r\n```javascript\r\nconst result = [ data[0], ...totals ];\r\n```\r\n\r\n- **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/wvBmbMp?editors=0012](https://codepen.io/jun68ykt/pen/wvBmbMp?editors=0012)\r\n\r\n以上、参考になれば幸いです。","dateModified":"2020-01-10T09:14:22.769Z","datePublished":"2020-01-10T07:39:44.452Z","upvoteCount":4,"url":"https://teratail.com/questions/234337#reply-341229","comment":[{"@type":"Comment","text":"いつもlodashの使い方 参考にさせてもらってます。\r\nlodash の_.chunkを使って の記載のところ、ハイフンになっているように見えます。","datePublished":"2020-01-10T09:12:01.499Z","dateModified":"2020-01-10T09:12:01.499Z"},{"@type":"Comment","text":"@oikashinoaさん\r\n> いつもlodashの使い方 参考にさせてもらってます。\r\nとの件と誤字の指摘、ありがとうございます。修正しました。","datePublished":"2020-01-10T09:17:20.920Z","dateModified":"2020-01-10T09:17:20.920Z"},{"@type":"Comment","text":"お忙しい中ご回答ありがとうございます。\r\nとても分かりやすく、勉強になりました。\r\n参考にさせていただきます。","datePublished":"2020-01-10T09:19:00.103Z","dateModified":"2020-01-10T09:19:00.103Z"},{"@type":"Comment","text":"@hachimitu_remonsさん\r\nどういたしまして。参考になれば幸いです。","datePublished":"2020-01-10T09:27:52.450Z","dateModified":"2020-01-10T09:27:52.450Z"}]},{"@type":"Answer","text":"これでどうでしょう。\r\n```javascript\r\nlet data = [\"sample1\", \"0.004\", \"0.003\", \"-0.0\", \"-0.004\", \"0.001\", \"-0.0\", \"-0.002\", \"0.002\", \"0.002\", \"0.002\", \"-0.003\", \"0.008\", \"0.011000000000000001\", \"0.004\", \"0.003\", \"-0.0\", \"-0.004\", \"0.001\", \"-0.0\", \"-0.002\"];\r\nlet func = (array) => {\r\n let cnt = 1, max = array.length, result = [];\r\n while(cnt < max) {\r\n let split = array.slice(cnt, cnt+10);\r\n result.push(split.reduce((a,c) => a+(+c), 0));\r\n cnt = cnt + 10;\r\n }\r\n return result;\r\n}\r\nvar result = split(data);\r\n```","dateModified":"2020-01-10T06:53:38.250Z","datePublished":"2020-01-10T06:53:38.250Z","upvoteCount":2,"url":"https://teratail.com/questions/234337#reply-341212","comment":[{"@type":"Comment","text":"お忙しい中ご回答ありがとうございます。\r\n参考にさせていただきます。","datePublished":"2020-01-10T08:49:55.046Z","dateModified":"2020-01-10T08:49:55.046Z"}]},{"@type":"Answer","text":"最初のラベルを削った配列を新たに作って、\r\n後は10個毎に処理して最後にラベルを先頭につければシンプルです。\r\n\r\n10個単位の処理は以下が参考になりますよ。\r\nhttps://teratail.com/questions/230247","dateModified":"2020-01-10T06:49:55.199Z","datePublished":"2020-01-10T06:49:55.199Z","upvoteCount":4,"url":"https://teratail.com/questions/234337#reply-341211","comment":[{"@type":"Comment","text":"お忙しい中ご回答ありがとうございます。\r\nそのように考えれば良かったのですね。\r\n参考にさせていただきます。","datePublished":"2020-01-10T09:09:23.056Z","dateModified":"2020-01-10T09:09:23.056Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"トップ","url":"https://teratail.com"},{"@type":"ListItem","position":2,"name":"データ構造に関する質問","url":"https://teratail.com/tags/%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0"},{"@type":"ListItem","position":3,"name":"データ構造","url":"https://teratail.com/tags/%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0"}]}}}
["sample1", "0.004", "0.003", "-0.0", "-0.004", "0.001", "-0.0", "-0.002", "0.002", "0.002", "0.002", "-0.003", "0.008", "0.011000000000000001",・・・・]
このような配列の値を、最初から順番に10個ずつ足して、結果の値を新しい配列に格納したいです。
一番最初の値はラベルなので、実際は二つ目の0.004から順に10個ずつ足したいです。
結果として求めているものは、
["sample1", "2個目から11個目までの和", "12個目から〜21個目までの和", "22個目から〜31個目までの和",・・・・]
という感じです。
データを10個ずつに分割して各要素の和を新しい配列に格納しようと試みたのですが、演算の際に最初の要素である"sample1"という文字列の扱いでつまずいてしまい、上手く作れませんでした。
Javascript
1 const split = ( array , n ) => array . reduce ( ( a , c , i ) => i % n == 0 ? [ ... a , [ c ] ] : [ ... a . slice ( 0 , - 1 ) , [ ... a [ a . length - 1 ] , c ] ] , [ ] ) ;
2 var result = split ( data , 10 ) ;
どなたかご教示のほど、よろしくお願いいたします。
こんにちは
この回答では、10個ずつ区切るために、lodash の _.chunk を使います。
前提として、ご質問にある
["sample1", "0.004", "0.003", "-0.0", "-0.004", "0.001", "-0.0", "-0.002", "0.002", "0.002", "0.002", "-0.003", "0.008", "0.011000000000000001",・・・・]
という形の配列は、 data という変数で与えられるものとします。
まずはじめに、数値を要素とする配列arrを与えると、要素の合計を返す関数 totalize(arr) を作っておきます。これは以下のようになります。
javascript
1 const totalize = arr => ( arr . reduce ( ( sum , e ) => sum + e ) ) ;
次に、 data の2番目以降の要素である文字列を数値に変換した配列 values を、以下によって作ります。
javascript
1 const values = data . slice ( 1 ) . map ( e => + e ) ;
lodash の _.chunk を使って、上記で得られた values の要素を10個ずつ区切った部分配列を要素とする配列を作り、その配列から、要素である各配列の合計値を要素とする配列totalsを作ります。これは以下のようにすると得られます。
javascript
1 const totals = _ . chunk ( values , 10 ) . map ( totalize ) ;
最後に、以下によって目的の配列 result が得られます。
javascript
1 const result = [ data [ 0 ] , ... totals ] ;
以上、参考になれば幸いです。
ベストアンサー
for文で愚直に繰り返した方がわかりやすい気がします。
javascript
1 const arr = [
2 "sample1" ,
3 "0.01" , "0.02" , "0.03" , "0.04" , "0.05" , "0.06" , "0.07" , "0.08" , "0.09" , "0.1" ,
4 "0.11" , "0.12" , "0.13" , "0.14" , "0.15" , "0.16" , "0.17" , "0.18" , "0.19" , "0.2" ,
5 "0.21" , "0.22" , "0.23" , "0.24" , "0.25" , "0.26" , "0.27" , "0.28" , "0.29" , "0.3" ,
6 "0.31" , "0.32" , "0.33" , "0.34" , "0.35" , "0.36" , "0.37" , "0.38" , "0.39" , "0.4" ,
7 "0.41" , "0.42" , "0.43" , "0.44" , "0.45" , "0.46" , "0.47" , "0.48" , "0.49" , "0.5" ,
8 "0.51" , "0.52"
9 ] ;
10 const makeArray = ( arr , spliter ) => {
11 const returnArr = [ arr [ 0 ] ] ;
12 for ( let i = 1 , tmp = 0 ; i < arr . length ; i ++ ) {
13 if ( i % spliter == 0 ) {
14 returnArr . push ( tmp + ( arr [ i ] - 0 ) ) ;
15 tmp = 0 ;
16 } else {
17 tmp += arr [ i ] - 0 ;
18 if ( i == arr . length - 1 ) returnArr . push ( tmp ) ; //余りの処理
19 }
20 }
21 return returnArr ;
22 } ;
23
24 console . log ( makeArray ( arr , 10 ) ) ;
回答ではないです
小数点以下の桁数が揃っていないので、有意な計算ができないと思われます。
仕様を練り直してみては?
javascript
1 const data = [
2 "sample1" ,
3 "0.01" , "0.02" , "0.03" , "0.04" , "0.05" , "0.06" , "0.07" , "0.08" , "0.09" , "0.1" ,
4 "0.11" , "0.12" , "0.13" , "0.14" , "0.15" , "0.16" , "0.17" , "0.18" , "0.19" , "0.2" ,
5 "0.21" , "0.22" , "0.23" , "0.24" , "0.25" , "0.26" , "0.27" , "0.28" , "0.29" , "0.3" ,
6 "0.31" , "0.32" , "0.33" , "0.34" , "0.35" , "0.36" , "0.37" , "0.38" , "0.39" , "0.4" ,
7 "0.41" , "0.42" , "0.43" , "0.44" , "0.45" , "0.46" , "0.47" , "0.48" , "0.49" , "0.5" ,
8 "0.51" , "0.52"
9 ] ;
10 const split = ( array , n ) => array . reduce ( ( a , c , i ) => i == 0 ? [ c ] : i % n == 1 ? [ ... a , [ c ] ] : [ ... a . slice ( 0 , - 1 ) , "" + ( + a [ a . length - 1 ] + + c ) ] , [ ] ) ;
11 const result = split ( data , 10 ) ;
12 console . log ( result )
実行結果
[
'sample1', '0.55',
'1.55', '2.55',
'3.55', '4.55',
'1.03'
]
これでどうでしょう。
javascript
1 let data = [ "sample1" , "0.004" , "0.003" , "-0.0" , "-0.004" , "0.001" , "-0.0" , "-0.002" , "0.002" , "0.002" , "0.002" , "-0.003" , "0.008" , "0.011000000000000001" , "0.004" , "0.003" , "-0.0" , "-0.004" , "0.001" , "-0.0" , "-0.002" ] ;
2 let func = ( array ) => {
3 let cnt = 1 , max = array . length , result = [ ] ;
4 while ( cnt < max ) {
5 let split = array . slice ( cnt , cnt + 10 ) ;
6 result . push ( split . reduce ( ( a , c ) => a + ( + c ) , 0 ) ) ;
7 cnt = cnt + 10 ;
8 }
9 return result ;
10 }
11 var result = split ( data ) ;
15分調べてもわからないことは teratailで質問しよう!
ただいまの回答率 85.29%
質問をまとめることで 思考を整理して素早く解決
テンプレート機能で 簡単に質問をまとめる
質問する