
[code]

    [{
        id: 1,
        name: hoge,
    }, {
        id: 2,
        name: hoge,
    }, {
        id: 3,
        name: huga,
    }, {
        id: 4,
        name: piyo,
    }, {
        id: 5,
        name: huga,
    }, {
        id: 6,
        name: hoge,
    }]
    
[/code]

JavaScriptで上記のデータから `name`  
の重複をみつけて以下のような値を取得したいのですが、やり方が思いつきません。

[code]

    // 理想
    {
        hoge: [1, 2, 6],
        huga: [3, 5]
    }
    
    // これでも問題なし
    [1, 2, 6, 3, 5]
    
[/code]

みなさんならどのようなプログラムを組みますか?  
参考にさせてください。

よろしくお願いします。


CC BY-SA 3.0
2015-03-12T06:38:42.590
7823
2015-03-13T02:56:31.900
7339
question
javascript json
JavaScriptでJSONの重複値を取得したい


学校の課題をそのまま出されてる感ありますが。。。

[code]

    b = function(array) {
       var result = {};
       for (var i = 0 ; i < array.length ; ++i) {
           var l = result[array[i].name];
           if (l === undefined) {
               result[array[i].name] = [array[i].id]; 
           } else {
               l.push(array[i].id);
           }
        }
        // length=1なものを除去する
        var keys = [];
        for (var k in result) {
            keys.push(k);
        }
        for (var i = 0 ; i < keys.length ; ++i) {
            if (result[keys[i]].length <= 1) {
                delete result[keys[i]];
            } 
        }
        return result;
    };
    
[/code]


CC BY-SA 3.0
2015-03-12T07:15:09.740
7825
2015-03-12T08:03:42.387
2015-03-12T08:03:42.387
845
845
7823
answer

[code]

    var arr = [{
        id: 1,
        name: "hoge",
    }, {
        id: 2,
        name: "hoge",
    }, {
        id: 3,
        name: "huga",
    }, {
        id: 4,
        name: "piyo",
    }, {
        id: 5,
        name: "huga",
    }, {
        id: 6,
        name: "hoge",
    }];
    
    
    (function(arr) {
      var m = {};
      arr.forEach(function(i) {
          m[i.name] ? m[i.name].push(i.id) : m[i.name] = [i.id];
      });
      for (var i in m) {
        if (m.hasOwnProperty(i) && m[i].length == 1) delete m[i];
      }
      console.log(JSON.stringify(m))
    })(arr);
    
[/code]

こんな感じでしょうか。


CC BY-SA 3.0
2015-03-12T08:49:19.053
7835
2015-03-12T08:49:19.053
440
7823
answer

[code]

    var temp = {};
    var ans = {};
    array.forEach(function(obj){
        var box = temp[obj.name] || (temp[obj.name] = []);
        if(box.push(obj.id) == 2){
            ans[obj.name] = box;
        }
    });
    
[/code]

これでどうでしょう


CC BY-SA 3.0
2015-03-12T09:05:54.533
7837
2015-03-12T09:05:54.533
4191
7823
answer


Underscore.jsを使うと、直感的に書ける気がします。

groupByで、nameを元にグループ化。  
pickで、二個以上あるものを取り出す。  
mapObjectで、結果を整形。  
のようにやっています。

[code]

    var a = [{
        id: 1,
        name: 'hoge',
    }, {
        id: 2,
        name: 'hoge',
    }, {
        id: 3,
        name: 'huga',
    }, {
        id: 4,
        name: 'piyo',
    }, {
        id: 5,
        name: 'huga',
    }, {
        id: 6,
        name: 'hoge',
    }];
    
    
    var result = _.chain(a)
      .groupBy(function(o){ return o.name; })
      .pick(function(o){ return o.length > 1; })
      .mapObject(function(o){return _.pluck(o,'id');})
      .value();
    
    document.querySelector('.result').innerHTML = JSON.stringify(result);
[/code]

[code]

    <script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.2/underscore-min.js"></script>
    <p class="result"></p>
[/code]


CC BY-SA 3.0
2015-03-13T02:44:14.660
7859
2015-03-13T02:56:31.900
2015-03-13T02:56:31.900
8305
8305
7823
answer