["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
1const 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);
どなたかご教示のほど、よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
こんにちは
この回答では、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
1const totalize = arr => (arr.reduce((sum, e) => sum + e));
次に、 data
の2番目以降の要素である文字列を数値に変換した配列 values
を、以下によって作ります。
javascript
1const values = data.slice(1).map(e => +e);
lodash の _.chunk を使って、上記で得られた values
の要素を10個ずつ区切った部分配列を要素とする配列を作り、その配列から、要素である各配列の合計値を要素とする配列totals
を作ります。これは以下のようにすると得られます。
javascript
1const totals = _.chunk(values, 10).map(totalize);
最後に、以下によって目的の配列 result
が得られます。
javascript
1const result = [ data[0], ...totals ];
- 動作確認用CodePen: https://codepen.io/jun68ykt/pen/wvBmbMp?editors=0012
以上、参考になれば幸いです。
投稿2020/01/10 07:39
編集2020/01/10 09:14総合スコア9058
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/10 09:12
2020/01/10 09:17
2020/01/10 09:19
2020/01/10 09:27
0
最初のラベルを削った配列を新たに作って、
後は10個毎に処理して最後にラベルを先頭につければシンプルです。
10個単位の処理は以下が参考になりますよ。
https://teratail.com/questions/230247
投稿2020/01/10 06:49
総合スコア2826
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
for文で愚直に繰り返した方がわかりやすい気がします。
javascript
1const 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]; 10const 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 24console.log(makeArray(arr, 10));
投稿2020/01/10 06:33
編集2020/01/10 06:36総合スコア337
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/10 08:57
0
回答ではないです
小数点以下の桁数が揃っていないので、有意な計算ができないと思われます。
仕様を練り直してみては?
投稿2020/01/10 08:45
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんな感じでどうでしょう
- CodePen:offset位置、range幅調整可能
投稿2020/01/10 08:32
編集2020/01/10 08:46総合スコア114843
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/10 08:51 編集
2020/01/10 08:49
2020/01/10 09:07
2020/01/10 09:15
0
javascript
1const 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]; 10const 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)], []); 11const result = split(data, 10); 12console.log(result)
実行結果
[ 'sample1', '0.55', '1.55', '2.55', '3.55', '4.55', '1.03' ]
投稿2020/01/10 07:55
編集2020/01/10 07:59総合スコア5406
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
これでどうでしょう。
javascript
1let 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"]; 2let 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} 11var result = split(data);
投稿2020/01/10 06:53
総合スコア351
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。