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

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

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

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

配列

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

Q&A

解決済

2回答

529閲覧

配列→JSONにした後にそのJSONを配列に戻すと、先頭のキーがなくなっているので加えたい。

siranui

総合スコア54

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

配列

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

0グッド

0クリップ

投稿2022/04/05 04:59

前提

配列をファイルに保存するために、
配列を一度JSON文字列にし、その後配列に戻そうとしました。

JSON(markov)

1Markov { 2 data: { 3 null: [ '我輩', 'メロス' ], 4 '我輩': [ 'は' ], 5 'は': [ '猫', '激怒' ], 6 '猫': [ 'で' ], 7 'で': [ 'ある' ], 8 'ある': [ null ], 9 'メロス': [ 'は' ], 10 '激怒': [ 'し' ], 11 'し': [ 'た' ], 12 'た': [ null ] 13 } 14}

上記の配列をこのように配列→JSON→配列にしたところ、
(一度JSONにしているのはファイルに書き込むためです。)

Node.js

1arr = JSON.stringify(markov); 2markov2 = JSON.parse(arr);

JSON(markov2)

1{ 2 data: { 3 null: [ '我輩', 'メロス' ], 4 '我輩': [ 'は' ], 5 'は': [ '猫', '激怒' ], 6 '猫': [ 'で' ], 7 'で': [ 'ある' ], 8 'ある': [ null ], 9 'メロス': [ 'は' ], 10 '激怒': [ 'し' ], 11 'し': [ 'た' ], 12 'た': [ null ] 13 } 14}

このようにMarkov がなくなってしまいました。

実現したいこと

markov2にMarkov のキーを加えたい。

試したこと

"Markov " + markov2と書いてみましたが、やはりMarkov [object Object]と返ってきました。

arr = "Markov " + arrと書いてみましたが、JSON文字列と判断されずJSON.parse(arr)ができませんでした。

Markov の無いmarkov2だと、TypeError: markov2.make is not a functionと言われ読み込んでもらえませんでした。

補足情報(FW/ツールのバージョンなど)

Replitで動かしています。
元々やろうとしていることはマルコフ連鎖です。ここのサイトを参考に作りました。
また、Discordで動くbotを作っています。
しかしこれらの情報は今回は関係無いだろうと思い上記には書きませんでした。
一応、全体のコードを載せておきます。

js

1if (command === "あ") { 2 var fs = require('fs'); 3 var moji = require('kuromoji'); 4 var builder = moji.builder({ 5 dicPath: 'node_modules/kuromoji/dict' 6 }); 7 class Markov { 8 constructor(n) { 9 this.data = {}; 10 } 11 // データ登録 12 add(words) { 13 for (var i = 0; i <= words.length; i++) { 14 var now = words[i]; 15 if (now === undefined) { 16 now = null 17 }; 18 var prev = words[i - 1]; 19 if (prev === undefined) { 20 prev = null 21 }; 22 23 if (this.data[prev] === undefined) { 24 this.data[prev] = []; 25 } 26 this.data[prev].push(now); 27 } 28 } 29 // 指定された文字に続く文字をランダムに返す 30 sample(word) { 31 var words = this.data[word]; 32 if (words === undefined) { 33 words = []; 34 } 35 return words[Math.floor(Math.random() * words.length)]; 36 } 37 // マルコフ連鎖でつなげた文を返す 38 make() { 39 var sentence = []; 40 var word = this.sample(null); 41 while (word) { 42 sentence.push(word); 43 word = this.sample(word); 44 } 45 return sentence.join(''); 46 } 47 } 48 49 var markov = new Markov(); 50 51 builder.build(function(err, tokenizer) { 52 if (err) { 53 throw err; 54 } 55 56 // アシタカ先輩の台詞を読み込む 57 fs.readFile('TEST.txt', 'utf-8', function(err, data) { 58 if (err) { 59 throw err; 60 } 61 62 var lines = data.split("\n"); // 一行ごとに分割 63 wordlist = "" 64 lines.forEach(function(line) { 65 var tokens = tokenizer.tokenize(line); 66 67 // トークンを文中表記にすべて変換 68 words = tokens.map(function(token) { 69 return token.surface_form; 70 }); 71 markov.add(words); 72 }); 73 arr = JSON.stringify(markov) 74 markov2 = JSON.parse(arr) 75 76 console.log(markov) 77 console.log("〜〜〜〜〜〜〜〜〜〜〜〜") 78 console.log(markov2); 79 80 fs.writeFile("all_3.json", arr, (err1) => { 81 if (err1) throw err; 82 }); 83 message.channel.send(markov2.make()) 84 }); 85 }); 86 return; 87 }

TEST.txt

1我輩は猫である 2メロスは激怒した

all_3.json

1{"data":{"null":["我輩","メロス"],"我輩":["は"],"は":["猫","激怒"],"猫":["で"],"で":["ある"],"ある":[null],"メロス":["は"],"激怒":["し"],"し":["た"],"た":[null]}}

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

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

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

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

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

guest

回答2

0

ベストアンサー

class Markov のインスタンスを JSON 化したあと class Markov のインスタンスとして復元したいのでしたら、

js

1arr = JSON.stringify(markov); 2let markov2 = new Markov(); 3markov2.data = JSON.parse(arr).data;

こんな感じじゃないでしょうか。

(dataフィールドを直接書き換えるのは行儀が悪いので、Markov クラスに load(json) とか static deserialize(json) のようなメソッドを足すほうがよいでしょう)

投稿2022/04/05 05:18

編集2022/04/05 05:19
int32_t

総合スコア20832

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

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

siranui

2022/04/05 05:34

とても腑に落ちやってみたのですが、 Markov { data: undefined } となってしまいました。undefinedの部分はどうしたら得られますか?
int32_t

2022/04/05 05:51

それは何の出力ですか? arr の内容は質問文の all_3.json と一致してますか?
siranui

2022/04/05 07:08

arr = JSON.stringify({ Markov: markov }) let markov2 = new Markov(); markov2.data = JSON.parse(arr).data; console.log(markov) console.log("〜〜〜〜〜〜〜〜〜〜〜〜") console.log(markov2); 返信遅れてすみません。このように書きました。 ファイルに書き込まずそのままやっているため、all_3.jsonとは現在関係がありません。
int32_t

2022/04/05 07:13

> arr = JSON.stringify({ Markov: markov }) この行が私の回答と違います。
siranui

2022/04/05 07:20

できました、ありがとうございました!
guest

0

単に、JSON.stringify({Markov: markov})とする、では物足りないでしょうか?

投稿2022/04/05 05:03

maisumakun

総合スコア145183

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

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

siranui

2022/04/05 05:07 編集

やってみたのですが、このように[Array]が出てきてしまいます。 { Markov: { data: { null: [Array], '我輩': [Array], 'は': [Array], '猫': [Array], 'で': [Array], 'ある': [Array], 'メロス': [Array], '激怒': [Array], 'し': [Array], 'た': [Array] } } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問