Javascript 按内部数组值筛选数组

Javascript 按内部数组值筛选数组,javascript,Javascript,我有一个包含如下数组的对象: { "media": [ { "title": "Raiders of the Lost Ark", "year": "1981", "poster": "http://ia.media-imdb.com/images/M/MV5BMjA0ODEzMTc1Nl5BMl5BanBnXkFtZTcwODM2MjAxNA@@._V1_SY1000_CR0,0,664,1000_

我有一个包含如下数组的对象:

{
    "media": [
        {
            "title": "Raiders of the Lost Ark",
            "year": "1981",
            "poster": "http://ia.media-imdb.com/images/M/MV5BMjA0ODEzMTc1Nl5BMl5BanBnXkFtZTcwODM2MjAxNA@@._V1_SY1000_CR0,0,664,1000_AL_.jpg",
            "genre": ["action", "adventure"],
            "type": "movie"
        },
        {
            "title": "The Other Guys",
            "year": "2010",
            "poster": "http://ia.media-imdb.com/images/M/MV5BMTc0NDQzNTA2Ml5BMl5BanBnXkFtZTcwNzI2OTQzMw@@._V1_.jpg",
            "genre": ["action", "comedy", "crime"],
            "type": "movie"
        }
    ]
}
我正在尝试创建一个过滤器函数,它将返回具有特定类型的所有项目

这是我制作的过滤器,但似乎没有返回任何值

//pretend movies equals my parsed JSON file 
const Movies = json.media; 

const Filter = function(array, key, value){
    let i, j, filteredResults = [], item;

    for(i =  0, j = array.length; i<j; i++){
        item = array[i];
        if(typeof item[key] !== "undefined" && item[key] === value){
            filteredResults.push(item);
        }
    }

    return filteredResults;
}

console.log(Filter(Movies, "genre", "action"));
//假装电影等于我解析的JSON文件
const Movies=json.media;
常量过滤器=函数(数组、键、值){
设i,j,filteredResults=[],item;
对于(i=0,j=array.length;i使用

if(_.contains(item[key], value)){
  filteredResults.push(item);
}
而不是

if(typeof item[key] !== "undefined" && item[key] === value){
  filteredResults.push(item);
}

您可以使用filter方法

var medias = [
    {
        "title": "Raiders of the Lost Ark",
        "year": "1981",
        "poster": "http://ia.media-imdb.com/images/M/MV5BMjA0ODEzMTc1Nl5BMl5BanBnXkFtZTcwODM2MjAxNA@@._V1_SY1000_CR0,0,664,1000_AL_.jpg",
        "genre": ["action", "adventure"],
        "type": "movie"
    },
    {
        "title": "The Other Guys",
        "year": "2010",
        "poster": "http://ia.media-imdb.com/images/M/MV5BMTc0NDQzNTA2Ml5BMl5BanBnXkFtZTcwNzI2OTQzMw@@._V1_.jpg",
        "genre": ["action", "comedy", "crime"],
        "type": "movie"
    }
]
sortedMedias = medias.filter(elem => elem.genre.indexOf("crime")!=-1);
console.log(sortedMedias); //  [ { title: 'The Other Guys',
                           //      year: '2010',
                           //      poster: 'http://ia.media-imdb.com/images/M/MV5BMTc0NDQzNTA2Ml5BMl5BanBnXkFtZTcwNzI2OTQzMw@@._V1_.jpg',
                           //      genre: [ 'action', 'comedy', 'crime' ],
                           //      type: 'movie' } ]

我想你应该保持简单。我想这样的东西可能适合你

function movieFilter (where, field, search) {
  if (typeof search !== "string") { search = search.toString()}; //for example if you want to search by the year, and you provide integer search number
  return where.filter(item => {
    return item[field].toLowerCase().indexOf(search.toLowerCase()) !== -1;
  })
}
下面是此函数的一个示例

如果您试图生成一个通用过滤函数,您应该考虑以下几个情况:

  • 严格相等(==)
  • 松散相等(=)
  • 一部分
var d={
“媒体”:[{
“标题”:“迷失方舟的掠夺者”,
“年份”:“1981年”,
“海报”:http://ia.media-imdb.com/images/M/MV5BMjA0ODEzMTc1Nl5BMl5BanBnXkFtZTcwODM2MjAxNA@@._V1_SY1000_CR0,06641000_AL_.jpg”,
“类型”:[“动作”、“冒险”],
“类型”:“电影”
}, {
“头衔”:“其他人”,
“年份”:“2010年”,
“海报”:http://ia.media-imdb.com/images/M/MV5BMTc0NDQzNTA2Ml5BMl5BanBnXkFtZTcwNzI2OTQzMw@@._V1_u.jpg“,
“类型”:[“动作”、“喜剧”、“犯罪”],
“类型”:“电影”
}]
}
var _g=“动作”;
函数过滤器(数组、键、值、操作){
返回数组.filter(x=>{
开关(操作){
大小写“contains”:返回x[key].indexOf(value)>-1;
案例“ignoreType”:返回x[键]==值;
默认值:返回x[键]==值;
}
})
}
log(过滤器(d.media,“流派”,“动作”,“包含”))
控制台日志(过滤器(d.media,“年份”,2010))

console.log(filter(d.media,“year”,2010,“ignoreType”)
您就快到了。只有一点需要更改:

  • “genre”属性本身就是一个数组,因此“action”的“indexOf”是 必须检查参数

    const Filter = function(obj, key, value) {
        let i, j, filteredResults = [], item;
    
        // The media property is the array in which we want to search 
        let array = obj.media;
    
        for(i =  0, j = array.length; i < j; i++){
            item = array[i];
    
            // the genre property is itself an array
            // so we'll need to find the 'indexOf' the item
            // rather than comparing directly
    
            if(typeof item[key] !== "undefined" && item[key].indexOf(value) !== -1){
                filteredResults.push(item);
            }
        }
    
        return filteredResults;
    }
    
    const Filter=函数(对象、键、值){
    设i,j,filteredResults=[],item;
    //media属性是要在其中搜索的数组
    让数组=obj.media;
    对于(i=0,j=array.length;i

首先需要找到值的索引。如果索引不是-1,则表示值在数组中存在

for(i =  0, j = array.length; i<j; i++){
    item = array[i];
    if(typeof item[key] !== "undefined" && item[key].indexOf(value) !==    -1 ){
        filteredResults.push(item);
    }
}

for(i=0,j=array.length;i
Movies.filter(m=>m.genre.includes('action'))
在您的实现中:
item[key]==value
这里您将数组与字符串进行比较。请研究JSON是什么,不是什么。这不是JSON。它只是一个JavaScript对象。此外,这似乎不是关于“排序”的“过滤”。最后,这与ES6有什么关系?哇,这是一个非常好的实现感谢@zekms要解决您的问题,您可以使用调试器逐行“调试”它。关注包含
if
的行。在该行上断开,并检查变量
项[键]
并且您应该能够看到为什么不满足该条件。未标记下划线,请提供本机解决方案。
for(i =  0, j = array.length; i<j; i++){
    item = array[i];
    if(typeof item[key] !== "undefined" && item[key].indexOf(value) !==    -1 ){
        filteredResults.push(item);
    }
}