【问题标题】:Get object based on matching key value in nested array根据嵌套数组中的匹配键值获取对象
【发布时间】:2013-12-31 16:31:19
【问题描述】:

我有一个电影提要,我试图在其中检索具有特定键值的对象的“名称”值。回复如下:

{
    genres: [
        {
            id: 18,
            name: "Drama"
        },
    ],
    homepage: "http://www.therewillbeblood.com/",
    id: 7345,
    imdb_id: "tt0469494",
    release_date: "2007-12-26",
    crew: [
        {
            id: 4762,
            name: "Paul Thomas Anderson",
            department: "Writing",
            job: "Screenplay",
            profile_path: "/6lDE5N6lQUvAbKBRazn2Q0mRk44.jpg"
        },
        {
            id: 52563,
            name: "Upton Sinclair",
            department: "Writing",
            job: "Novel",
            profile_path: null
        },
        {
            id: 2950,
            name: "Robert Elswit",
            department: "Camera",
            job: "Director of Photography",
            profile_path: null
        },
        {
            id: 1809,
            name: "Dylan Tichenor",
            department: "Editing",
            job: "Editor",
            profile_path: null
        },
        {
            id: 4762,
            name: "Paul Thomas Anderson",
            department: "Directing",
            job: "Director",
            profile_path: "/6lDE5N6lQUvAbKBRazn2Q0mRk44.jpg"
        },
        {
            id: 4772,
            name: "Cassandra Kulukundis",
            department: "Production",
            job: "Casting",
            profile_path: null
        }
    ]
}

所以我试图用“Director”的“job”键值获取对象,这将是 Paul Thomas Anderson。

这是我的 javascript,我在其中根据 release_date 的值设置年份变量。只是想弄清楚如何设置 director 变量:

<script type="text/javascript">
$(document).ready(function() {
var url = 'http://api.themoviedb.org/3/movie/';

imdb_id = 'tt0102685';
key = '?api_key=XXXXXXXXXXXX';
append = '&append_to_response=credits';
$.ajax({
    type: 'GET',
    url: url + imdb_id + key + append,
    dataType: 'jsonp',
    success: function(data) {
      var $year = data.release_date.substring(0, 4);
      $('#year').html($year);
    },
});

});
</script>

任何帮助将不胜感激!花了将近两天时间试图弄清楚它无济于事。

【问题讨论】:

    标签: javascript json api jsonp


    【解决方案1】:

    如果您使用现代浏览器,您可以使用filter 函数:

    var name = data.crew.filter(function(e){
        return (e.job=="Director") ? true:false;
    })[0].name;
    

    JS 小提琴: http://jsfiddle.net/gTzyT/

    错误处理示例

    function getDirectorName(crew){
        var name = "";
        try{
            name = json.crew.filter(function(e){
               return e.job=="Director"
            })[0].name;
        }catch(err){
           name = "No Director";
        }
        return name;    
    }
    
    //calling the method                           
    alert(getDirectorName(data.crew));
    

    【讨论】:

    • 有效,但应该有错误处理代码,以应对返回的数组可能为空的情况。
    • 另外(e.job == "Director") 表达式已经产生了一个布尔值。无需使用三元运算符强制转换为 true:false。所以只需return e.job === 'Director';
    • @broofa 关心查看错误处理,想听听您的建议。
    • 为什么 try-catch 而不是简单地检查返回的数组长度?我不喜欢 try-catch 有几个原因:1)它可以掩盖调用代码可能关心的意外错误,例如e 未定义且 2) 尝试捕获性能比 if () ... 差几个数量级。请参阅jsperf.com/try-catch-error-perf/3(“table”视图)我还建议返回 null 而不是“No Director”,因为(恕我直言)这是一个语义上更正确的值。
    【解决方案2】:

    对于稍微“不同”的方法,请先按工作排序。例如

    data.crew.sort(function(a,b) {
      return a.job == 'Director' ? -1 : 1;
    });
    console.log(data.crew[0].name); // => name of Director
    

    jsfiddle here

    注意:我不一定赞同这个解决方案。排序不是最高效的方法。而且它有副作用(改变data.crew 数组的顺序,这可能是不可取的)。但这是一种“可爱”的解决方案,所以我想我会把它扔在那里。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      相关资源
      最近更新 更多