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

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

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

配列

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

Underscore.js

Underscore.jsは、JavaScriptのためのユーティリティライブラリです。JavaScriptの関数・配列、オブジェクトを扱う際に度々発生する処理がメソッドとしてまとめられています。他のライブラリに依存しないため、稼働中のアプリケーションにも導入可能です。

Q&A

解決済

4回答

4610閲覧

Javascript 二次元配列内の重複を削除したいです

hachimitu_remon

総合スコア14

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

配列

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

Underscore.js

Underscore.jsは、JavaScriptのためのユーティリティライブラリです。JavaScriptの関数・配列、オブジェクトを扱う際に度々発生する処理がメソッドとしてまとめられています。他のライブラリに依存しないため、稼働中のアプリケーションにも導入可能です。

0グッド

0クリップ

投稿2020/01/17 07:09

Javascript

1var sample10 = [ 2[0.1, 0.1, 0.1, 0.1], 3[0.2, 0.2, 0.2, 0.2], 4[0.3, 0.3, 0.3, 0.3] 5];

上記のように重複した値を持つ二次元配列の、
重複を無くして一次元配列にしたいです。

求めている結果は、

Javascript

1[ 2 0.1, 3 0.2, 4 0.3 5]

という形です。

Underscore.jsを用いて、下記のようなコードで試してみました。

Javascript

1var func = function (x, i, self) { 2 return self.indexOf(x) === i; 3}; 4var resultArray = _.map(sample10, func); 5console.log(resultArray); 6

コンソール結果は、

[true, true, true]

となってしまっています。

求めている一次元配列を作るにはどうしたら良いのでしょうか。
どなたかご教示のほど、よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

Underscore.jsを使っているのならば
_.chainという必殺構文があるのでこれを使いましょう。

js

1var sample10 = [ 2 [0.1, 0.1, 0.1, 0.1], 3 [0.2, 0.2, 0.2, 0.2], 4 [0.3, 0.3, 0.3, 0.3] 5]; 6_.chain(sample10) 7 .flatten() 8 .uniq() 9 .tap(console.log) 10 .value();

行数こそ5行程度とそれなりに長いですが、
やりたいことが中学生でも瞬時に理解出来るように上から書いてあるだけなので
読みやすさは他の追従を許しません。

flattenで1次元配列に潰して
uniqで重複取り除いて
tap(console.log)で値を出力
valueで計算開始!からの値が取り出せる(チェイン構文の決まりごと)

後で使うなら何か変数に保存しておいて、改めてconsole.logかなんかで出力して確認すれば良いでしょう。

投稿2020/01/17 08:37

miyabi-sun

総合スコア21158

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

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

hachimitu_remon

2020/01/17 10:01

miyabi-sunさん、ご回答ありがとうございます。 こんなに分かりやすくシンプルに書けるのですね。 勉強になりました。
miyabi-sun

2020/01/17 10:21

勉強になったようで良かったです。 因みにUnderscore.jsのような書き方はわりとメジャーで、 RubyやPythonは標準でこういう機能が用意されててスイスイ書けます。 流行りのElixirとかElm、Haskellとかの関数型プログラミング言語にもありますので、 Underscore流儀に慣れておけば他のプログラミング言語も同じじゃん楽勝みたいな感じで操れるようになります。 暇な時間に機能一覧を眺めて「へー、こんな機能存在するんだ」と調べてみてください。 一生の財産になるくらいプログラミング力が向上するので、値の加工が楽しくなると思いますよ。
hachimitu_remon

2020/01/17 10:30

そうなんですね! Underscoreをもっと勉強してみたいと思いました。 質問へのご回答だけでなく、さらにこのようなことも教えてくださり、大変感謝しております。
guest

0

投稿2020/01/17 07:28

x_x

総合スコア13749

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

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

hachimitu_remon

2020/01/17 10:09

x_xさん、ご回答ありがとうございます。 sample10.map(a => [...new Set(a)]).flat() のコードで作れました。 一行で書けるなんて。。勉強になりました。
guest

0

命題がおかしいです

[0.1, 0.1, 0.1, 0.1]→0.1(※0,1typo修正)
としていますが
[0.1]じゃなければ重複しない値があったときに表現できません

投稿2020/01/17 07:47

編集2020/01/17 08:00
yambejp

総合スコア114767

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

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

x_x

2020/01/17 07:51

質問文中に 0.1 は出てきますが、0 や 1 は出てきていないと思います。
yambejp

2020/01/17 08:02

typoはなおしました、 よく読み返したらいいたいことは理解できました。 配列内の各配列をユニーク処理するのではなく 全部まとめてユニークににするということですね・・・
x_x

2020/01/17 08:08

ああ、なるほど。 [...new Set(sample10.flat())] ではなく、 sample10.map(a => [...new Set(a)]).flat() なんでしょうかね
guest

0

ベストアンサー

https://qiita.com/cocottejs/items/7afe6d5f27ee7c36c61f

以下のコードを利用し、

js

1var a = [1,2,3,3,2,2,5]; 2 3// 重複を削除したリスト 4var b = a.filter(function (x, i, self) { 5 return self.indexOf(x) === i; 6 }); 7 8console.log(a); // [ 1, 2, 3, 3, 2, 2, 5 ] 9console.log(b); // [ 1, 2, 3, 5 ]

以下のように書くことで実現可能だと思われます。

js

1var sample10 = [ 2 [0.1, 0.1, 0.1, 0.1], 3 [0.2, 0.2, 0.2, 0.2], 4 [0.3, 0.3, 0.3, 0.3] 5]; 6 7var distinct = sample10.map(l => l.filter(function (x, i, self) { 8 return self.indexOf(x) === i; 9 })).flat(); //flatで[[0.1],[0.2],[0.3]]を[0.1,0.2,0.3]に 10 11console.log(distinct);

投稿2020/01/17 07:15

編集2020/01/17 07:18
kimkim

総合スコア142

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

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

hachimitu_remon

2020/01/17 07:26

kimkimさん、丁寧なご回答を頂き大変感謝申し上げます。 filterとmapをこのようにして同時に使うことができるのですね。 とても勉強になりました。
kimkim

2020/01/17 08:42

よかったです! でも私の回答は質問の意図をしっかり把握した上での回答ではなかったため、 他の方の回答もしっかり参考にするといいかもしれません!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問