35

Underscore.js を使用してオブジェクトの配列を検索しようとしていますが、必要なものをターゲットにできないようです。

console.log(_.findWhere(response.data, { TaskCategory: { TaskCategoryId: $routeParams.TaskCategory } }));

ただし、これは次のように返さundefined $routeParams.TaskCategoryれます301

これは、私が検索している配列内のオブジェクトの例です。このデータは、data.response

[{
    "TaskCategory": {
        "TaskCategoryId": 201,
        "TaskName": "TaskName"
    },
    "TaskCount": 1,
    "Tasks": [{
        "EventTypeId": 201,
        "EventName": "Event Driver",
        "EventDate": "0001-01-01T00:00:00",
        "EventId": "00000000-0000-0000-0000-000000000000",
    }]
},
{
    "TaskCategory": {
        "TaskCategoryId": 301,
        "TaskName": "TaskName"
    },
    "TaskCount": 1,
    "Tasks": [{
        "EventTypeId": 201,
        "EventName": "Event Driver",
        "EventDate": "0001-01-01T00:00:00",
        "EventId": "00000000-0000-0000-0000-000000000000",
    }]
}]

を使用してその配列の 2 番目のオブジェクトが必要ですが、TaskCategory.TaskCategoryIdアンダースコアを使用して取得することは可能ですか?

4

2 に答える 2

61

_.findfindWhere の代わりに使用します。

console.log(_.find(response.data, function(item) {
    return item.TaskCategory.TaskCategoryId == $routeParams.TaskCategory; 
}));

これらは似ていfindWhereますが、キーと値のペアを照合する特殊なケース向けに設計されています (ネストされたオブジェクトが含まれるため、シナリオでは役に立ちません)。 Find述語として関数を提供できるため、より一般的に使用されます。

于 2013-10-21T17:55:14.930 に答える
7

_.findWhere/のソースは以下の_.where通り

_.where = function(obj, attrs, first) {
  if (_.isEmpty(attrs)) return first ? void 0 : [];
  return _[first ? 'find' : 'filter'](obj, function(value) {
    for (var key in attrs) {
      if (attrs[key] !== value[key]) return false;
    }
    return true;
  });
};

_.findWhere = function(obj, attrs) {
  return _.where(obj, attrs, true);
};

ご覧のとおり、深い平等ではなく、厳密な平等を実行します。どこを深く検索したい場合は、これで十分です(テストされておらず、最適化されていません):

_.whereDeep = function(obj, attrs, first) {
  if (_.isEmpty(attrs)) return first ? void 0 : [];
  return _[first ? 'find' : 'filter'](obj, function(value) {
    for (var key in attrs) {
      if (attrs[key] !== value[key] || !(_.isObject(attrs[key]) && _.whereDeep([value[key]], attrs[key], true))) return false;
    }
    return true;
  });
};

_.findWhereDeep = function(obj, attrs) {
  return _.whereDeep(obj, attrs, true);
};

そして、ほとんど変更せずにコードを使用できるようになります

_.findWhereDeep(response.data, { TaskCategory: { TaskCategoryId: $routeParams.TaskCategory } });
于 2013-10-21T18:06:12.960 に答える