質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

7回答

2474閲覧

Javascriptで配列の要素をN個ずつ足して新しい配列を作りたいです。

hachimitu_remon

総合スコア14

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

1グッド

1クリップ

投稿2020/01/10 06:06

["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);

どなたかご教示のほど、よろしくお願いいたします。

DrqYuto👍を押しています

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

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

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

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

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

yambejp

2020/01/10 06:37

与えられる値が文字列なのでしょうか?
guest

回答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 ];

以上、参考になれば幸いです。

投稿2020/01/10 07:39

編集2020/01/10 09:14
jun68ykt

総合スコア9058

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

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

oikashinoa

2020/01/10 09:12

いつもlodashの使い方 参考にさせてもらってます。 lodash の_.chunkを使って の記載のところ、ハイフンになっているように見えます。
jun68ykt

2020/01/10 09:17

@oikashinoaさん > いつもlodashの使い方 参考にさせてもらってます。 との件と誤字の指摘、ありがとうございます。修正しました。
hachimitu_remon

2020/01/10 09:19

お忙しい中ご回答ありがとうございます。 とても分かりやすく、勉強になりました。 参考にさせていただきます。
jun68ykt

2020/01/10 09:27

@hachimitu_remonsさん どういたしまして。参考になれば幸いです。
guest

0

最初のラベルを削った配列を新たに作って、
後は10個毎に処理して最後にラベルを先頭につければシンプルです。

10個単位の処理は以下が参考になりますよ。
https://teratail.com/questions/230247

投稿2020/01/10 06:49

oikashinoa

総合スコア2826

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

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

hachimitu_remon

2020/01/10 09:09

お忙しい中ご回答ありがとうございます。 そのように考えれば良かったのですね。 参考にさせていただきます。
guest

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
satoshi_tajima

総合スコア337

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

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

hachimitu_remon

2020/01/10 08:57

早急なご回答ありがとうございました。 ご回答者様のコードを参考に実行した結果、うまく配列を作る事が出来ました。 本当にありがとうございました。
guest

0

回答ではないです

小数点以下の桁数が揃っていないので、有意な計算ができないと思われます。
仕様を練り直してみては?

投稿2020/01/10 08:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hachimitu_remon

2020/01/10 09:01

ご指摘ありがとうございます。 今後の課題として受け止めさせて頂きます。
guest

0

こんな感じでどうでしょう

  • CodePen:offset位置、range幅調整可能

投稿2020/01/10 08:32

編集2020/01/10 08:46
yambejp

総合スコア114829

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

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

yambejp

2020/01/10 08:51 編集

<div id="view"></div> <script> const a=[ "sample1", "0.01","0.02","0.03","0.04","0.05","0.06","0.07","0.08","0.09","0.1", "0.11","0.12","0.13","0.14","0.15","0.16","0.17","0.18","0.19","0.2", "0.21","0.22","0.23","0.24","0.25","0.26","0.27","0.28","0.29","0.3", "0.31","0.32","0.33","0.34","0.35","0.36","0.37","0.38","0.39","0.4", "0.41","0.42","0.43","0.44","0.45","0.46","0.47","0.48","0.49","0.5", "0.51","0.52" ]; const offset=1; const range=10; const b=Array(parseInt((a.length-1-offset)/range)+offset+1) .fill(null) .map((x,y)=>y<offset?a[y]:a.filter((i,j)=>j>=(y-offset)*range+offset&&j<(y-offset+1)*range+offset).reduce((x,y)=>x+parseFloat(y),0)); document.querySelector('#view').textContent=b.join(','); </script>
yambejp

2020/01/10 08:49

残念ながら小数点の計算だと誤差が結構出ます
hachimitu_remon

2020/01/10 09:07

コメントへの返事が遅くなってしまい申し訳ございませんでした。。 ご回答者様が提示してくださったコードで勉強させていただいております。 いろいろ調べながら、しっかり理解する事ができたら、実行してみようと思います。 お忙しい中ご回答ありがとうございました。
yambejp

2020/01/10 09:15

codepenの方のサンプルでoffset位置やrangeを手動で切り替えて 試してくださいねー
guest

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
shiracamus

総合スコア5406

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

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

hachimitu_remon

2020/01/10 08:43

お忙しい中ご回答ありがとうございます。 参考にさせていただきます。
guest

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

SE-studying-now

総合スコア351

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

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

hachimitu_remon

2020/01/10 08:49

お忙しい中ご回答ありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問