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

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

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

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

JavaScript

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

Q&A

解決済

1回答

1540閲覧

MapをforEachで処理している最中に条件を満たす場合はKEYを変更したいのにできない。。。

777

総合スコア34

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2015/08/15 17:09

お世話になります。

以下のようなコードで試しています。

マップの要素を全部読みます。

各要素のV1という配列を順番に読みます。
numに設定した値(例では34)が見つかれば、
変数numにコロンをつけた値(例では:34)を
KEYから取り除いて、KEYに上書きさせようとしています。

コンソール上で中間出力でk:12:56:78が一瞬表示されるので
出来たかなと思ったのですが、最終出力を見ると
もとのままk:12:34:56:78になっており変化無しです。

何故かわからず、途方にくれております。
どなた様かお知恵拝借出来ませんでしょうか。

<コード>
mmap = new Map();
num = 34;
mmap.set("k:12:34:56:78", {
"v1": [12, 34, 56, 78],
"V2": ["aa", "bb", "cc", "dd"] //cc
});
mmap.set("k:12:78", {
"v1": [12, 78],
"V2": ["aa", "dd"] //cc
});

mapDisp("bef", mmap);
mmap.forEach(function(value, key, map) {
tmp = value.v1;
len = tmp.length;
for (i = 0; i < len; i++) {
if (tmp[i] == num) {
key = key.replace(":"+num,"")
console.log(key);
break;
}
}
});
mapDisp("aft", mmap);

function mapDisp(situation, targetMap) { //@testcode
console.log("<-------------------------------" + situation + "-----------------------------------start");
console.log("size:" + targetMap.size);
targetMap.forEach(function(value, key, map) {
console.log("m:" + JSON.stringify(key) + "\nv: " + JSON.stringify(value) + "\n--");
});
console.log("<-------------------------------------------------------------------------------------end");
}

<結果>
<-------------------------------bef-----------------------------------start
size:2
m:"k:12:34:56:78"
v: {"v1":[12,34,56,78],"V2":["aa","bb","cc","dd"]}

m:"k:12:78"
v: {"v1":[12,78],"V2":["aa","dd"]}

<-------------------------------------------------------------------------------------end
k:12:56:78
<-------------------------------aft-----------------------------------start
size:2
m:"k:12:34:56:78"
v: {"v1":[12,34,56,78],"V2":["aa","bb","cc","dd"]}

m:"k:12:78"
v: {"v1":[12,78],"V2":["aa","dd"]}

<-------------------------------------------------------------------------------------end

<環境>
npm: '2.10.1',
http_parser: '2.3',
modules: '14',
node: '0.12.4',
openssl: '1.0.1m',
uv: '1.5.0',
v8: '3.28.71.19',
zlib: '1.2.8'

windows7 32bit

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

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

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

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

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

guest

回答1

0

ベストアンサー

map の key を変更する場合は一度、delete() してから set() し直す必要があります。

JavaScript

1var key = 'k:12:34:56:78', 2 value = {'v1': [12, 34, 56, 78], 'V2': ['aa', 'bb', 'cc', 'dd']}, 3 map = new Map([[key, value]]); 4 5map.delete(key); 6map.set('k:1', value); 7console.log(map.get('k:1')); // {'v1': [12, 34, 56, 78], 'V2': ['aa', 'bb', 'cc', 'dd']}

可能ならば、設計を見直して可変データは value に持って行くほうがスマートだと思います。

投稿2015/08/15 17:22

think49

総合スコア18162

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

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

777

2015/08/16 03:47

think49さん、ありがとうございます。 退避したものを書き換えて、 元のレコードを削除した後に追加しました。 追加質問で恐縮なのですが、前回私の投稿で console.log(key); としたときに k:12:56:78 と、KEYが変更されているように見えるのですが、 これは、MAP本体のキーではなくて FOREACH内部に用意されてるコピーのようなもの という意味なのでしょうか? ご存じであれば教えて頂けますでしょうか。
think49

2015/08/16 06:53

callback 関数内の key は「参照」ではないので元の値に影響しません。
777

2015/08/17 00:45

think49さん ご回答ありがとうございます。 納得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問