0

このような json オブジェクトの場合、

list=[
 {name:"hello",
  category:"verb"},
 {name:"world",
  category:"noun"}
];

これを取得するためにアンダースコアを使用して配列を分類する最速の方法は次のとおりです。

category=[
{id:"verb",
 list:[
  {name:"hello",
  category:"verb"}
 ]},
{id:"noun",
 list:[
  {name:"world",
  category:"noun"}
 ]}
];

それはある種のチェーンされた map-reduce である必要があります...もちろん、ループを使用して_.filter(ただし、それは遅くなります)、またはforループを使用してこれを簡単に行うことができます。

4

2 に答える 2

1

OK、見つけました:

groupBy _.groupBy(list, iterator)
コレクションをセットに分割し、 iterator を介して各値を実行した結果によってグループ化しますiteratorが関数ではなく文字列の場合、各値の iterator で指定されたプロパティによってグループ化されます。

_.groupBy([1.3, 2.1, 2.4], function(num){ return Math.floor(num); });
=> {1: [1.3], 2: [2.1, 2.4]}

_.groupBy(['one', 'two', 'three'], 'length');
=> {3: ["one", "two"], 5: ["three"]}

だから私はこれを使ってそれをやった(私はすでにリストを持っていた):

var listofwords=_.groupBy(doc.words, function(word){
        return word.category;
    });
    _.each(doc.lists,function(list){
        list.words=listofwords[list.name];
    });
于 2012-04-27T05:19:25.550 に答える
0

私は思う、これはもっと速いはずです

list = [
  {name:"hello", category:"verb"},
  {name:"world", category:"noun"}
];

var addresses = {};

var catList = _.reduce(list, function(cat, item) {
  var address = addresses[item.category];
  if(typeof address == 'undefined') {
    addresses[item.category] = address = cat.length;
    cat.push({id: item.category, list: []});
  }
  cat[address].list.push(item);
  return cat;
}, []);
于 2012-04-27T05:36:57.787 に答える