我在这里遇到了一个令人费解的问题,在这里我使用Backbone中的集合检索了JSON对象。这是该对象的外观:
{ "MatchID": "00000001", "Date": "1970-01-01T00:00:00.000Z", "OriginalID": "", "Stage": { "StageNumber": "0", "StageType": "Stage Type" }, "Round": { "RoundNumber": "0", "Name": "Round Name" }, "Leg": "1", "HomeTeam": { "TeamID": "0", "Name": "Home Team Name" }, "AwayTeam": { "TeamID": "0", "Name": "Away Team Name" }, "Venue": { "VenueID": "0", "Name": "Venu Name" }, "Referee": null, }
我要处理的数据是根据特定属性(例如Venue.Name或Date属性)过滤的(它们在对象中的深度不同,对于某些其他数据,其深度可能超过两个层次) 。我在Backbone集合中有以下代码来过滤并返回一个新集合,其内容已适当过滤:
findWhere: function (Attribute, Value) { return new Project.Collections.Fixtures(this.filter(function (fixture) { return eval('fixture.attributes.' + Attribute) == Value; })); }
这使我可以在一个属性中指定要针对任何对象深度使用的属性以及要与之相等的属性。问题是,我真的不想使用“ eval”来做到这一点,但是显然我不能对“ AwayTeam.TeamID”之类的东西使用“ [Attribute]”,因为它不起作用。
有谁知道不使用eval即可实现此功能的方法?
这样的事情会让您遍历对象的层次结构以找到一个值:
var x = { y: { z: 1 } }; function findprop(obj, path) { var args = path.split('.'), i, l; for (i=0, l=args.length; i<l; i++) { if (!obj.hasOwnProperty(args[i])) return; obj = obj[args[i]]; } return obj; } findprop(x, 'y.z');
您可以将此作为方法添加到Fixture对象中:
Fixture
Fixture = Backbone.Model.extend({ findprop: function(path) { var obj = this.attributes, args = path.split('.'), i, l; for (i=0, l=args.length; i<l; i++) { if (!obj.hasOwnProperty(args[i])) return; obj = obj[ args[i] ]; } return obj; } });
并用它来提取价值
var f = new Fixture(); f.findprop("HomeTeam.TeamID");
findWhere然后可以将该方法重写为
findWhere
findWhere: function (Attribute, Value) { return new Project.Collections.Fixtures(this.filter(function (fixture){ return fixture.findprop(Attribute) === Value; })); }
和一个小提琴玩http://jsfiddle.net/nikoshr/wjWVJ/3/