当前位置: 首页 > 面试题库 >

使用数组符号从JSON对象检索多级属性

东明德
2023-03-14
问题内容

我在这里遇到了一个令人费解的问题,在这里我使用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 = 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: function (Attribute, Value)
{
    return new Project.Collections.Fixtures(this.filter(function (fixture){
        return fixture.findprop(Attribute) === Value;
    }));
}

和一个小提琴玩http://jsfiddle.net/nikoshr/wjWVJ/3/



 类似资料:
  • 本文向大家介绍JavaScript 从对象检索属性,包括了JavaScript 从对象检索属性的使用技巧和注意事项,需要的朋友参考一下 示例 性能特点: 可以从对象检索的属性可能具有以下特征, 可数 不可数 拥有 在使用创建属性时,我们可以设置其特征(“ own”除外)。在对象的直接级别而非原型级别()可用的属性称为自己的属性。Object.defineProperty(ies)__proto__

  • 问题内容: 假设此JSON对象: 可以像这样检索“ set2”属性: 有没有一种方法可以通过索引检索“ set2”属性?它是JSON对象的第二个属性。这是行不通的(当然): 因此,假设我要检索JSON对象的第二个属性,但我不知道它的名称-那么我该怎么做? 更新: 是的,我知道对象是无序属性的集合。但是我不认为浏览器会干扰JSON文字/字符串定义的“原始”顺序。 问题答案: JavaScript中的

  • 问题内容: 我有成千上万个包含多个JSON对象的文本文件,但是不幸的是,这些对象之间没有分隔符。对象存储为字典,它们的某些字段本身就是对象。每个对象可能具有可变数量的嵌套对象。具体来说,一个对象可能看起来像这样: 并在文本文件中串联了数百个这样的对象而没有分隔符。这意味着我既不能使用也不可以。 关于如何解决此问题的任何建议。是否有已知的解析器可以执行此操作? 问题答案: 这将从字符串中解码您的JS

  • 问题内容: 这很难解释,但我会尽力而为。 我有2个具有多对多关系的桌子;有一个定义关系的链接表。这些表分别命名为Question,QuestionTopic和Topic。主题具有字段TopicID和TopicName.Question具有字段QuestionID和QuestionText。 我想检索主题列表以及属于该主题的问题数量。但是,可以将主题归为一组,并且应该知道该组合所独有的问题数。举个例

  • 我是一个Laravel新手,我正在转换一个php/jQuery应用程序到Laravel。原始代码使用带有ajax POST的JSON数组,检索如下: 我在POST方面也做了很多相同的事情,但我在我的Laravel$请求收集中没有看到任何数据。我是否需要做一些特殊的事情来检索如下结构的JSON数据: 这是我的jQuery ajax POST代码(带有硬编码数据) 这是我的控制器中接收POST的代码

  • 问题内容: 我的arraylist包含String数组对象。我如何获得所有价值?我的代码如下 如果我尝试像上面给出的那样进行检索, 怎么做? 问题答案: 您还必须遍历字符串数组。