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

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

新規登録して質問してみよう
ただいま回答率
85.30%
JavaScript

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

Q&A

解決済

3回答

4425閲覧

JavaScript:キーが重複したオブジェクトを作りたい

Ykkykk

総合スコア140

JavaScript

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

0グッド

0クリップ

投稿2022/02/03 04:05

元になるオブジェクトの配列→[{...}, {...}, {...}] それぞれのオブジェクト ↓ {name: 'test', value: '1'} {name: 'sample', value: '2'} {name: sample', value: '3'}

上記のようなオブジェクトの配列があったときに、これを一つのオブジェクトにまとめたいです。

JavaScript

1var param = 上記の例の配列; 2var obj = {}; 3 4$.map(param, function(n, i){ 5 obj[n['name']] = n['value']; 6});

としたところ、sampleというキーの値が最後に追加された値になってしまいます。これをもとのデータにあったように、同じキーの値をすべて保持することはできないでしょうか。

{test: '1', sample: '2', sample'3'}

上記のように一つのオブジェクトで複数の同一のキーを持つようにしたいです。

上記のようなオブジェクトがJavaScriptの仕様上作成できない場合は、

{test: '1', sample: '2, 3'} or {test: '2', sample: [2, 3]}

のように、同一のキーの値をまとめてしまってもいいかと思っております。ご教示賜れますと幸いです。よろしくお願いいたします。

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

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

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

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

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

maisumakun

2022/02/03 04:14

> 同一のキーの値をまとめてしまってもいいかと思っております。 こちらについて、コードは検討してみましたでしょうか。 (キーの重複は不可能です)
Ykkykk

2022/02/03 04:19

そうなのですね、、、。では配列か何かで一つのキーに複数の値を持たせることになるのですね。 $.map(param, function(n, i){ if (obj[n['name']] == 'sample'){ obj[n['name']].obj[n['name']].push(obj[n['value']]); } }); とりあえず同一キーの配列になれば、と思い、上記のようにしてみたのですが、特にエラーなどは出ずにまた配列にもならず最初と同じように最後の値だけが渡されている状況です。。。
guest

回答3

2

ベストアンサー

一つのオブジェクトで複数の同一のキーを持つようにしたいです。

それは不可能です。

同一のキーの値をまとめてしまってもいい

単純に obj[n['name']]n['value'] を代入するのではなくて、

  • obj[n['name']] が undefined だったら、従来どおり代入
  • obj[n['name']] が配列だったら、そこに push(n['value'])
  • obj[n['name']] がそれ以外だったら、[obj[n['name']], n['value']] を代入

投稿2022/02/03 04:35

編集2022/02/03 04:48
int32_t

総合スコア21929

kei344, Ykkykk👍を押しています

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

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

Ykkykk

2022/02/03 04:50

ご回答いただきありがとうございます。おっしゃっているようにしてみたのですが、三つ重複している場合、最初の二つが配列で最後の一つは整数の配列になってしまいました。。。下記のようにしてみております。 $.map(param, function(n, i){ if (obj[n['name']] == undefined){ obj[n['name']] = n['value']; } else if (obj[n['name']].isArray == true){ obj[n['name'].push(n['value']); } else { obj[n['name']] = [obj[n['name']], n['value']]; } }); すると、重複している箇所が、sample: [[1, 2], 3]のようになっております。上記のコードだとどこが問題となるでしょうか。
Ykkykk

2022/02/03 05:01

すみません、大変初歩的なミスでした。ご提示いただいたように、リストを値として保持することができました。本当にありがとうございます。。。
guest

1

javascript

1const param = [{name: 'test', value: '1'}, 2{name: 'sample', value: '2'}, 3{name: 'sample', value: '3'}]; 4let obj = {}; 5 6for (x of param) { 7 if (x.name in obj) { 8 if (typeof(obj[x.name]) == "string") { 9 obj[x.name] = [obj[x.name]]; 10 } 11 obj[x.name].push(x.value); 12 } else { 13 obj[x.name] = x.value; 14 } 15} 16 17console.log(obj)

無条件に配列にするならもちっと簡単になります。

投稿2022/02/03 04:58

takasima20

総合スコア7468

Ykkykk👍を押しています

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

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

Ykkykk

2022/02/03 05:08

ご教示いただきありがとうございます。このようなやり方もできるのですね。JavaScriptを始めたばかりで手探り状態なため本当に助かります。ありがとうございます。
guest

0

formdataでやるのが普通では?

javascript

1const fd=new FormData(); 2fd.append('test', '1'); 3fd.append('sample', '2'); 4fd.append('sample', '3'); 5console.log(fd.get('sample'));//2 6console.log(fd.getAll('sample'));//["2","3"]

投稿2022/02/03 05:08

yambejp

総合スコア117780

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問