根据嵌套数组中匹配的键值获取对象

Get object based on matching key value in nested array

本文关键字:键值 获取 取对象 嵌套 数组      更新时间:2023-09-26

我有一个电影提要,我试图在其中检索具有特定键值的对象的"name"值。以下是回应:

{
    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
        }
    ]
}

因此,我试图找到"导演"的"工作"关键价值观的对象,那就是保罗·托马斯·安德森。

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

<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>

如有任何帮助,我们将不胜感激!花了将近两天的时间试图弄清楚,但都无济于事。

如果你使用现代浏览器,你可以使用过滤功能:

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

JS Fiddle: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));

对于稍微"不同"的方法,请先按作业排序。例如

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

jsfiddle此处

注意:我不一定赞同这个解决方案。排序不是最高效的方法。并且它有副作用(改变data.crew阵列的顺序,这可能是不希望的)。但这是一个"可爱"的解决方案,所以我想我会把它扔出去。:)