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

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

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

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

Q&A

解決済

3回答

634閲覧

JavaScriptで配列を元にマトリョーシカのような連想配列を作成・追記したい

azkazunami36

総合スコア1

JavaScript

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

0グッド

1クリップ

投稿2023/02/02 21:44

編集2023/02/02 23:02

実現したいこと

存在する連想配列に、配列で指定して書き込むというものを作成したいです。
以下の配列を使用して書き込む。
["one", "two", "three"]
これはone.two.threeと同等だとして
もしtwoというオブジェクトが存在しない場合は作成してくれるようなものが欲しいです。

例えば何もない状態では下のものが完成します。

json

1{ 2 "one": { 3 "two": { 4 "three": {} 5 } 6 } 7}

元のJSONが存在する場合

json

1{ 2 "data": { 3 "video": { 4 "pass": "" 5 } 6 } 7}

上のdataの中にaudioという配列を追加したくなった際
["data", "audio"]
という配列を使って

json

1{ 2 "data": { 3 "video": { 4 "pass": "" 5 }, 6 "audio": {} 7 } 8}

という結果になるようにしたいです。

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

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

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

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

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

guest

回答3

0

これでもいけます!

javascript

1const arr = ["one", "two", "three"]; 2const obj = arr.reverse().reduce( (acc, cur) => ( {[cur]: acc} ), {}); 3console.log(obj);

reduceメソッドについて

  • .reduce( コールバック関数, 初期値 )メソッドは、処理した結果を蓄積できるメソッドです。
  • コールバック関数の引数は以下の通りです。
    • acc → 蓄積されている結果
    • cur → 配列の現在処理を行なっている要素
  • 初期値とは、配列の0番目を処理する際はまだ蓄積された結果accが何もないので、何か指定した状態から開始することもできます。
使用例

reduceは配列内の数値の合計値などを算出するときによく使われます。

javascript

1const numbers = [8, 10, 2]; 2const sum1 = numbers.reduce((acc, cur) => acc + cur, 0); // 20 3const sum2 = numbers.reduce((acc, cur) => acc + cur, 5); // 25

こんな感じ。よく使うのでぜひ使ってみてください。

投稿2023/02/02 22:50

編集2023/02/02 23:17
Cocode

総合スコア2314

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

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

azkazunami36

2023/02/02 23:06

reduce...初めてみました。 見たことがあっても使ったことがないので、検証しながら理解してみます 回答ありがとうこざいます!
Cocode

2023/02/02 23:18 編集

(こちらのコメントに記載の内容を、回答を更新して書き換えました)
azkazunami36

2023/02/02 23:39

なるほど...!! 完全に理解しました!ありがとうございます! あと、これは無視しても構わないんですけど、僕質問内容を修正していて... もしよければ解決して欲しいんです...いいですかね...? 僕の思って書いた質問と、回答者の受け取った意味が全く違っていたみたいです...
Cocode

2023/02/02 23:40

拝見します。
azkazunami36

2023/02/03 00:12

あっありがとうございます!! 僕の本当に解決してほしいところで、どう足掻いてもいまだに解決できていません...
guest

0

ベストアンサー

こういう処理は再帰にするとわかりやすいと思います。

js

1function nest(a) { 2 let o = {}; 3 if (a.length > 0) 4 o[a[0]] = nest(a.slice(1)); 5 return o; 6}

更新された内容に関して:

js

1function addNestedProperties(list, dest) { 2 if (list.length == 0) 3 return; 4 const propertyName = list[0]; 5 if (!(propertyName in dest)) 6 dest[propertyName] = {}; 7 addNestedProperties(list.slice(1), dest[propertyName]); 8} 9let dest = {data:{video:{pass:""}}}; 10addNestedProperties(["data", "audio"], dest); 11console.dir(dest);

投稿2023/02/02 22:14

編集2023/02/03 00:30
int32_t

総合スコア20872

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

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

azkazunami36

2023/02/02 22:37

ありがとうございます!! 質問の回答としては最高の答えですっっ ただ、僕の質問が悪かったせいでそのコード、本当に作成するだけのコードなんですよね... 僕本当は柔軟性のある、元からあるjsonに追記する形で配列を生成するコードを書きたかったんです... でも回答ありがとうございます。僕時間かけて直して、僕が欲しかったコードに改良するようにします。 アドバイスが含まれているので、ベストアンサーにするかもしれません。
azkazunami36

2023/02/03 20:24

追記見ました!!!!! 最高の回答です!ありがとうございますっ 今ベストアンサーにしますね! そして、僕の使う用途のために、次のコードになりました function addNestedProperties(list: string[], dest: {}, write?: { name: string, data: any }) { if (list.length == 0) return () => { if (write) dest[write.name] = write.data } const propertyName = list[0] if (!(propertyName in dest)) dest[propertyName] = {} addNestedProperties(list.slice(1), dest[propertyName], write) } セミコロンはつけ忘れるとコードが汚くなるので、予め外してるだけです
guest

0

こんな感じでしょうか。

js

1function matryoshka([first, ...rest]) { 2 return { [first]: rest.length ? matryoshka(rest) : {} }; 3} 4 5console.log(matryoshka(['one', 'two', 'three'])) 6// { one: { two: { three: {} } } }

投稿2023/02/02 22:11

hoshi-takanori

総合スコア7895

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

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

hoshi-takanori

2023/02/02 22:15

matryoshka([]) が { undefined: {} } になるのは美しくないかも…。
azkazunami36

2023/02/02 22:33

この回答的を得ていると思いますよ! undefinedになるなら、first ? first : ""にしても良さそうですね...! そして、僕の質問が悪かったせいであなたのコードは、 僕の思っていたコードではありませんでした...すみません。 僕の思っていたコードはただの作成ではなく、以下のような作りを求めていました 元から作成済みのjson { data: { video: { pass: "" } } } そこに let point = ["data", "audio"] 上の配列を使用すると { data: { video: { pass: "" }, audio: {} } } になるプログラムを求めていました...m(_ _)m 僕が悪いので、頑張って改良して完成したらベストアンサーにすると思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問