繁体   English   中英

如何根据另一个具有 id 的 arrays 从对象数组中查找值

[英]how to find a value from an array of objects based on another arrays with ids

我正在尝试根据 id 过滤电影的流派名称。 因此,如果 id 匹配,我会得到那个名字。

const genres = [
  { id: 28, name: "Action" },
  { id: 12, name: "Adventure" },
  { id: 16, name: "Animation" },
  { id: 35, name: "Comedy" },
  { id: 80, name: "Crime" },
  { id: 99, name: "Documentary" },
  { id: 18, name: "Drama" },
  { id: 10751, name: "Family" },
  { id: 14, name: "Fantasy" },
  { id: 36, name: "History" },
  { id: 27, name: "Horror" },
  { id: 10402, name: "Music" },
  { id: 9648, name: "Mystery" },
  { id: 10749, name: "Romance" },
  { id: 878, name: "Science Fiction" },
  { id: 10770, name: "TV Movie" },
  { id: 53, name: "Thriller" },
  { id: 10752, name: "War" },
  { id: 37, name: "Western" },
];

const genre_ids = [10752, 10770, 18, 12]

您可以使用genre_ids过滤genres ,然后使用 map 特定值

function filterGenres(genres, ids) {
    return genres
        .filter((genre) => ids.indexOf(genre.id) != -1)
        .map((genre) => genre.name)
}

或者使用reduce function

function filterGenres(genres, ids) {
    return genres.reduce((results, genre) => {
        if(ids.indexOf(genre.id) != -1) {
            results.push(genre.name);
        }
        return results;
    }, []);
}

以下可能是实现预期目标的一种可能解决方案。

代码片段

 const getNames = (ids, objects) => ( ids.map(el => ( objects.find( ({id}) => id === el )?.name )) ); // below will be better in performance // but the names returned will be ordered based on 'genres' array // objects.filter(({id}) => ids.some(el => el === id)) //.map(({name}) => name) const genres = [ { id: 28, name: "Action" }, { id: 12, name: "Adventure" }, { id: 16, name: "Animation" }, { id: 35, name: "Comedy" }, { id: 80, name: "Crime" }, { id: 99, name: "Documentary" }, { id: 18, name: "Drama" }, { id: 10751, name: "Family" }, { id: 14, name: "Fantasy" }, { id: 36, name: "History" }, { id: 27, name: "Horror" }, { id: 10402, name: "Music" }, { id: 9648, name: "Mystery" }, { id: 10749, name: "Romance" }, { id: 878, name: "Science Fiction" }, { id: 10770, name: "TV Movie" }, { id: 53, name: "Thriller" }, { id: 10752, name: "War" }, { id: 37, name: "Western" }, ]; const genre_ids = [10752, 10770, 18, 12]; console.log(getNames(genre_ids, genres));

解释

  • 使用新方法getNames获取结果
  • 对于genre_ids数组中的每个 id
  • 查找genres中是否有条目(通过匹配id属性)
  • 如果找到,则从匹配的genres元素中返回name属性
  • 并返回结果数组(隐式地)

注释掉的方法:

  • 过滤genres并解构以仅获取id
  • 检查id是否存在于genre_ids数组中
  • 如果是,则使用.map仅解构name
  • 并且(隐式地)返回这个结果数组name s

此方法以不同的顺序返回(基于genres数组)。

你在尝试这样的事情吗 -

let genre_names = new Array();
for(let i=0; i<genre_ids.length; i++) {
   var a = genres.find(x=>x.id == genre_ids[i]);
   if (!!a)
     genre_names.push(a.name);
}
console.log(genre_names);

结果是[战争、电视电影、戏剧、冒险]?

您可以简单地通过使用Array.filter()Array.map()来实现。

 const genres = [ { id: 28, name: "Action" }, { id: 12, name: "Adventure" }, { id: 16, name: "Animation" }, { id: 35, name: "Comedy" }, { id: 80, name: "Crime" }, { id: 99, name: "Documentary" }, { id: 18, name: "Drama" }, { id: 10751, name: "Family" }, { id: 14, name: "Fantasy" }, { id: 36, name: "History" }, { id: 27, name: "Horror" }, { id: 10402, name: "Music" }, { id: 9648, name: "Mystery" }, { id: 10749, name: "Romance" }, { id: 878, name: "Science Fiction" }, { id: 10770, name: "TV Movie" }, { id: 53, name: "Thriller" }, { id: 10752, name: "War" }, { id: 37, name: "Western" }, ]; const genre_ids = [10752, 10770, 18, 12]; const res = genres.filter((obj) => { return genre_ids.indexOf(obj.id).== -1 }).map((filteredObj) => filteredObj;name). console;log(res);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM