ここから本文です

javascriptで重複キーを持つ値をマージしたい。 連想配列(object)は同じキーを...

que********さん

2019/5/118:53:44

javascriptで重複キーを持つ値をマージしたい。

連想配列(object)は同じキーを持つと上書きされるようなので
下記のように文字列化しています。

【文字列】
var str = (function() {/*
a:"aです",
a:"aです2",
a:"aです3,
b:"bです",
b:"bです2"
*/}).toString().match(/\/\*([^]*)\*\//)[1];

これを最終的に
連想配列化(オブジェクト)したいのですが、
何か良い方法はありますでしょうか?

ary[a]→aです,aです2,aです3
ary[b]→bです,bです2

と、いった具合にしたいです。


すごく難しいです。
なお【文字列】のキーに当たる部分は
様々なものがあります。
アルファベットだけではありません。

ご回答いただければ幸いです。
よろしくお願いいたします。。。

閲覧数:
65
回答数:
2
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

leg********さん

2019/5/212:55:09

サンプルを試作してみました。

<script>
//【文字列】
var str = (function() {/*
a:"aです",
a:"aです2",
a:"aです3",
b:"bです",
b:"bです2"
*/}).toString().match(/\/\*([^]*)\*\//)[1];

console.log("【文字列】");
console.log(str);

var arr = str.split(",");
var obj = {};

for(var i=0; i<arr.length; i++){
arr[i] = arr[i].split(":");
var key = arr[i][0];
var val = arr[i][1];

if (key in obj){
obj[key] += "," + val;
}else{
obj[key] = val;
}

}

console.log("【確認】");
for (var key in obj){
console.log(key + ":"+ obj[key]);
}
</script>

どうぞ、おためしになってみてください。

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

ois********さん

2019/5/123:25:32

「マージ」って、
2つ以上のオブジェクトを1つにまとめることを言うんだが、
どれとどれをマージしたい?
質問の内容を見る限りオブジェクトのマージの話には見えないんだけど。

質問の内容を、
むりやり「マージ」の話にもっていくとして、

────────────────
// 3つのオブジェクト
var obj1 = { "a": "aです", "b": "bです" };
var obj2 = { "a": "aです2", "b": "bです2" };
var obj3 = { "a": "aです3" };
// オブジェクトをマージ
obj = Object.assign( obj1, obj2, obj3 );
// マージの結果を出力
console.log( obj );
────────────────

これをやると、

────────────────
▼Object
a: "aです3"
b: "bです2"
────────────────

になってしまう。
これを、

────────────────
▼Object
a: "aです", "aです2", "aです3"
b: "bです", "bです2"
────────────────

にしたいっていう話でいいんだろうか?
それなら、

────────────────
//----* オブジェクトのリスト
var list = [
{ "a": "aです", "b": "bです" },
{ "a": "aです2", "b": "bです2" },
{ "a": "aです3" }
];
//----* マージ結果を入れるオブジェクト
var obj = new Object();
//----* マージ
for( let key in Object.assign( ...list ) ){
obj[ key ] = new Array();
for( let i=0; i<list.length; i++ ){
if( list[ i ][ key ] != undefined ){ obj[ key ].push( list[ i ][ key ] ) }
}
}
//----* マージ結果を出力
console.log( obj );
--------------------------------
【 結果 】
▼ Object
a: (3) [ "aです", "aです2", "aです3" ]
b: (2) [ "bです", "bです2" ]
────────────────

これじゃだめなんだろうか?
そもそも、

────────────────
var str = (function() {/*
a:"aです",
a:"aです2",
a:"aです3,
b:"bです",
b:"bです2"
*/}).toString().match(/\/\*([^]*)\*\//)[1];
────────────────

のように、
わざわざ手動で文字列 str として1つ1つの値を定義して、
それをオブジェクトに変換することを考えてるくらいなら、
最初からオブジェクトとして作ればいいだけだと思うんだけど…

────────────────
var obj = {
"a": [ "aです", "aです2", "aです3" ],
"b": [ "bです", "bです2" ]
}
────────────────

そういうことでもないんだろうし。
そもそも「マージ」の話ではないんだろうか。
何がやりたいのかいまいち分からん。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる