3

APIから受け取っている次のオブジェクトがあります。

{
   '2012-12-12': [
       { 'id': 1234,
         'type': 'A' },
       { 'id': 1235,
         'type': 'A' },
       { 'id': 1236,
         'type': 'B' },
    ],
   '2012-12-13': [
       { 'id': 1237,
         'type': 'A' },
       { 'id': 1238,
         'type': 'C' },
       { 'id': 1239,
         'type': 'B' },
    ]
}

次に、各オブジェクトの属性のすべての可能な値を保持するtypes、typeという名前の別の変数が必要です。この場合、次のようになります。Arraytype

types = ['A', 'B', 'C']

私はそれを機能的な方法で実行しようとしています(私はunderscore.jsを使用しています)が、それを実行する方法を理解することができません。今使っています

types = [];
_.each(response, function(arr1, key1) {
    _.each(arr1, function(arr2, key2) {
        types.push(arr2.type);
    });
});
types = _.uniq(types);

しかし、それは非常に醜いです。このコードを書くためのより良い方法を見つけるのを手伝ってくれませんか?

ありがとう!

4

2 に答える 2

5

これは機能するはずです:

types = _.chain(input) // enable chaining
  .values()            // object to array
  .flatten()           // 2D array to 1D array
  .pluck("type")       // pick one property from each element
  .uniq()              // only the unique values
  .value()             // get an unwrapped array

フィドル: http: //jsfiddle.net/NFSfs/

もちろん、必要に応じてすべての空白を削除できます。

types = _.chain(input).values().flatten().pluck("type").uniq().value()

または連鎖なし:

types = _.uniq(_.pluck(_.flatten(_.values(input)),"type"));

flattenはオブジェクトで機能するようですが、ドキュメントには機能しないように明記されています。実装に対してコーディングしたい場合は、への呼び出しを省略できますが、valuesお勧めしません。実装はいつか変更され、コードが不思議なことに壊れたままになる可能性があります。

于 2013-02-12T21:45:30.100 に答える
1

より短いコードが必要な場合は、オブジェクトを1つの配列にフラット化してから、その配列をマップできます。

var types = _.unique(_.map(_.flatten(_.toArray(response)), function(arr) {
    return arr.type;
}));

これが別のバージョンです。主に好奇心のためだけに。

var types = _.unique(_.pluck(_.reduce(response, _.bind(Function.apply, [].concat), []), "type"));

これがもう1つです。

var types = _.unique(_.reduce(response, function(acc, arr) {
    return acc.concat(_.pluck(arr,"type"));
}, []));

そしてもう一つ。

var types = _.unique(_.pluck([].concat.apply([], _.toArray(response)), "type"))
于 2013-02-12T21:51:38.317 に答える