JSで連想配列の重複チェック

このQ&Aのポイント
  • JSで配列同士(連想配列の値)で重複した値があったらまとめて再度配列に格納する方法を教えてください。
  • 例えば、配列A = 配列B[key1=>1,key2=>2],配列C[key1=>1,key2=>2],配列D[key1=>2,Key2=>4] という場合、重複した値を含む配列は 配列A[配列B[key1=>1,key2=>2],配列D[key1=>2,key2=>4]] という形で取得したいです。
  • お手数ですが、完成されたサンプルコードなど教えていただけると助かります。よろしくお願いします!
回答を見る
  • ベストアンサー

JSで配列同士の重複チェック

いつもお世話になっております表題の通りJSで配列同士(連想配列の値)で重複した値があったらまとめて再度配列に格納したいのですが、プログラムの書き方が思いつきません、、 教えて頂けないでしょうか?? 例、イメージ) 配列A = 配列B[key1=>1,key2=>2],配列C[key1=>1,key2=>2],配列D[key1=>2,Key2=>4]; この場合処理をして返ってくる期待値は 配列A[配列B[key1=>1,key2=>2],配列D[key1=>2,key2=>4]] ※配列Cは配列Bと中身が同じなため削除された という形で帰ってきてほしいです。 少し時間が無くて完成されたサンプルコードなど教えて頂けると幸いです どうぞよろしくお願いします!

質問者が選んだベストアンサー

  • ベストアンサー
  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.2

// JS1.6 or ES5 or IE9 function uniq(a) { var compare = function(x,y){ for (var i in x) if (x[i] !== y[i]) return false; return true }; var makeCondition = function(o){return function(x){return compare(x,o) && compare(o,x)}}; var callback = function(p,c){if (!p.some(makeCondition(c))) p.push(c); return p}; return a.reduce(callback, []); } 重複がまとめられた配列A = uniq(配列A);

catapalto
質問者

お礼

ありがとうございます。 試しにやってみたのですが、 function uniq(a) { var compare = function(x,y){ for (var i in x) if (x[i] !== y[i]) return false; return true }; var makeCondition = function(o){return function(x){return compare(x,o) && compare(o,x)}}; var callback = function(p,c){if (!p.some(makeCondition(c))) p.push(c); return p}; return a.reduce(callback, []); } var a = uniq(parentObj<-配列を入れたオブジェクト); TypeError: Cannot find function reduce in object [object Object]. (line 139) とエラーがでました。 そもそもreduceというメソッドが使えないということでしょうか。 うーん分かりません

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

なんかクリティカルな方法がありそうな気はしますが 一つ一つを検証しても大した手間ではないので、冗長な方法 <script> var array_A = [ {"key1":1,"key2":2}, {"key1":1,"key2":2}, {"key1":1,"key2":2}, {"key1":1,"key2":3}, {"key1":1,"key2":4}, {"key1":1,"key2":2}, {"key1":2,"key2":4}, {"key3":2,"key2":4}, {"key1":2,"key2":4} ]; //元データ表示 view(array_A); //共通データ削除 for(var i=array_A.length -1;i>=0;i--){ for(var j=array_A.length -1;j>i;j--){ if(check(array_A[i],array_A[j])){ //同じデータを表示 document.write(i+":"+j+"<br>"); //同じデータを削除 array_A.splice(j,1); } } } //結果表示 view(array_A); function view(arr){ for(var i=0;i<arr.length;i++){ document.write(i+"-&gt;"); for(var j in arr[i]) document.write(j+":"+arr[i][j]); document.write("<br>"); } } function check(obj1,obj2){ //かなり手を抜いて検証しているので改善の余地大 var flag=true; for(var i in obj1){ if(obj1[i]!=obj2[i]) flag=false; } for(var i in obj2){ if(obj1[i]!=obj2[i]) flag=false; } return flag; } </script>

関連するQ&A

  • 配列の重複削除について

    配列の重複削除について教えて下さい。 普通の重複チェックとは違い、3つの配列 それぞれに値があり、添え字が0から同じ ように始まり、3つの配列が全て同じものは、 例えば、 配列A[2]='30' 配列B[2]='000' 配列C[2]='1' 配列A[4]='30' 配列B[4]='000' 配列C[4]='1' は、1つの添え字にまとめたい。 その3つが一致したもの重複をまとめたいのと、 新しく出た3つの値は残したいのです。 つまり、以下のように抽出したいのです。 何か良い方法があれば教えて下さい。 perlで作成しています。 注)配列Cは空白もあります。 配列A( 10, 20, 30, 10, 30, 20) 配列B(000,010,000,010,000,000) 配列C(  , 0, 1, 0, 1, 1) ↓ 配列D( 10, 20, 30, 10, 20) 配列E(000,010,000,010,000) 配列F(  , 0, 1, 0, 1)

    • ベストアンサー
    • Perl
  • Perlでハッシュや配列で重複するキーについて

    ハッシュで重複するキーが値となるので、このハッシュはabdの3つのキーしか存在しないということでしょうか? %a = ('a'=>1, 'b'=>2, 'a'=>3, 'd'=>4); また、配列の場合はabadと4つ数になるということでしょうか? @a = ('a','b','a','d'); この場合配列で、重複する値を抽出するアルゴリズムが知りたいです。

    • ベストアンサー
    • Perl
  • JavaScriptの連想配列について

    myArray = new Array();  myArray["A001"] = new Array();   myArray["A001"]["B001"] = "B001";   myArray["A001"]["B002"] = new Array();    myArray["A001"]["B002"]["C001"] = "C001";    myArray["A001"]["B002"]["C002"] = "C002";  myArray["A002"] = "A002"; JavaScriptの連想配列について質問させて頂きます。 例えば上記のような配列があったとして、値とキーはそのままで "C001" と "C002" の"B002"配列への格納順序だけ入れ替えたい場合、 どのように実装すればよろしいでしょうか? ちなみにキーや値はサンプルで実際にはsort出来るルールはありません。。。 ※入れ替え後のイメージ --------------------------------------------------------------------- myArray = new Array();  myArray["A001"] = new Array();   myArray["A001"]["B001"] = "B001";   myArray["A001"]["B002"] = new Array();    myArray["A001"]["B002"]["C002"] = "C002"; ←格納順序が    myArray["A001"]["B002"]["C001"] = "C001";  入れ替わった  myArray["A002"] = "A002"; ---------------------------------------------------------------------

  • VC#で配列の値の重複チェックについて

    いつもお世話になっております。時間もなく焦っています。 ファイルの内容を全て読み込ませて、配列に値を格納しているのですが、その際行単位ではなく、配列全体でもし同じ値が既にあった場合に重複させないように格納するには、どうすればよいでしょうか? 行単位なら、参考ページなども少しはありましたが、配列となると、。 わかりにくいかもしれませんが、宜しくお願いします。

  • 配列型の宣言?

    こんにちは。 あるサイトで見たphpのサンプルなのですが、 postされた全ての値を配列に格納するもので、以下のような記述がありました。 foreach((array)$_POST as $key => $value){  $array[$key] = $value; } ポストされた全ての値を、配列$arrayに連想配列として格納しているのはわかるのですが、 foreachの、(array)というのはどういう働きをするものなのでしょうか。 これは、$_POSTが配列であるという宣言でしょうか。 それと、postされた値がない場合、$_POSTを配列だと宣言しておくことで、foreachのエラーを回避するような役割もあるのでしょうか。 恥ずかしながら、(array)のような記述をphpではあまり見ないような気がするのですが、なんというキーワード(?)で勉強すれば理解が深められるかもご教授頂けますと助かります。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • linq.jsでの連想配列の検索方法について

    ・前提・実現したいこと javascriptでlinq.jsを使い、連想配列に格納したデータを検索したいと思っています。 どなたか連想配列を使用した場合の無名変数の書き方をご教授いただけますでしょうか? ・発生している問題・エラーメッセージ 特にエラーメッセージは出ていませんが、検索結果0件になります。 ・該当のソースコード // クラス定義 // function cQuestion(qIndex, qContent,qImportance){ this.qIndex = qIndex; this.qContent = qContent; this.qImportance = qImportance; } //問題リスト(連想配列) var questions = new Object(); //リストに追加 questions['A01'] = new cQuestion( 'A01', 'テスト' , 9] ); //検索結果 記述A var listItems = Enumerable.From(questions) .Where(function(x) {return x.qIndex == 'A01'}) .Select(function(x) { return x.qIndex }) .ToArray(); //検索結果 記述B var listItems = Enumerable.From(questions) .Where(function(key) { return this[key].qIndex == 'A01'},questions) .Select(function(key) { return this[key].qIndex },questions) .ToArray(); ・試したこと データはquestionsに格納できています。 「記述A」と「記述B」とで記述してみました。

  • 配列から別の配列の要素を削除する方法

    ある配列array_aに、100件の文字列要素が格納されています。 別の配列array_bには、80件の文字列要素が格納されています。 array_aの要素、array_bの要素共に重複するものはありません。 array_b中に存在する要素はすべてarray_a中にも存在します。 array_aにあり、array_bにはない要素で構成されたarray_cの作り方を教えてください。 例えば $array_a=array("a","b","c","d","e","f","g"); $array_b=array("e","b","d"); なら、 $array_c=array("a","c","f","g") になります。 配列array_aとarray_bは、 $array_b=array("b","b","d"); であったり、 $array_a=array("a","a","b","c","d","e","f","g"); といった「重複する要素を含むパターン」はありません。要素はすべてユニークです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • jsファイルで配列を定義し、jsファイルを切りかえて使う

    お世話になります。 jsファイルで配列を定義し、その配列の内容を表示しています。 いくつかのjsファイルで配列を定義し、そのjsファイを切りかえることにより、表示する配列の内容を切りかえることはできないでしょうか。 例えば data_a.js DataAry = new Array( new WNData('2006/11/10','ああ','・・.html'), new WNData('2006/11/10','いい','・・.html'), ・・・・・ ); data_b.js DataAry = new Array( new WNData('2006/11/10','aa','・・.html'), new WNData('2006/11/10','bb','・・.html'), ・・・・・ ); dspDataAry.jsで function WNData(Date,Cmnt,Href,Target){ this.Date=Date; this.Cmnt=Cmnt; this.Href=Href; } function DspData(){ strhtml="・・・・ (DataAryを表示するhtmlを作成) return strhtml; } dspDataAry.htmlで <script type='text/javascript' src='dspDataAry.js'></script> <script type='text/javascript' src='data_a.js'></script> <body> <script type='text/javascript'><!-- document.write DspData(); //--> </script> <input id="btn_b" type="button" value="bを表示" onClick="bを表示する関数"<br> </body> とすれば、data_a.jsの配列の内容が表示されます。 ボタン「bを表示」を押すことにより、 data_b.jsを読み込んで、その内容を表示するようにできないものでしょうか。 onClick="bを表示する関数"この「bを表示する関数」をいう関数をどのように書いたらよいのかわかりません。 data_a.js、data_b.jsで定義する配列名は同じとします。 data_c.js、data_d.js・・・といくつかに分けたく思っています。 前もってdata_b.jsを読み込むのでなく、必要に応じて読み込んで表示するようにしたいのですが。 よろしくお願いいたします。

  • 配列を比較して同じものがあった場合にそのKEYを返す

    二つの配列を比較して同じ値が入っていた場合、そのKEYを配列に入れたいと思います。 (例)$aと$bを比較して同じ値が入っているときに$aのkeyを$cに格納したい。 $a = array("","","山","","川","海","","富士山","空","",""); $b = array("川","","","","","海","","富士山","空",""); ※空白は無視したい。 この場合 $c = array("4","5","7","8"); のようにしたいと思います。 どなたか教えてください。

    • ベストアンサー
    • PHP
  • 配列にある重複要素を削除したい(VBA)

    エクセルVBAにて、あるルールで対象となるセルの値を配列に格納しております。 配列の要素には重複しているものもあるため、重複要素を配列から削除したいのですが その方法が分かりません。 どなたか、よろしくご教授下さい。

専門家に質問してみよう