按另一个数组的值过滤数组?

时间:2015-08-22 07:22:04

标签: javascript arrays ecmascript-6

我有一个数组:

    [
        {
            "website": "www.aaa.aaa", 
            "score": 90,
            "tags": [ "Video Online"]
        },
        {
            "website": "www.bbb.bbb", 
            "score": 90,
            "tags": ["Streaming Video"]
        },
        {
            "website": "www.ccc.ccc", 
            "score": 90,
            "tags": ["Video"]
        }
    ]

我希望过滤器标签带有'Video',用于此阵列。过滤后使用关键字“视频”。我希望结果所有对象'标签'都包含javascript ES5或ES6的'视频'。

我写了下面的代码,但它只使用args ==数组的值:

transform(val, args) {
        //console.log(args[0]);
        if(typeof args[0] === 'undefined') {
            return val;
        }

        return val.filter((el) => {
            //console.log(el.tags);
            return el.tags.indexOf(args[0]) != -1;  // return array[2]
        });
    }

2 个答案:

答案 0 :(得分:2)

基本上你想要制作一个自定义匹配功能。你似乎在功能上编程,这很酷 - 它很适合这种问题。我已经添加了一些建议,以使其更加强大。

我之前从未见过CrWinDefRet的简写,所以我认为这实际上是一件事!

  1. 确保您正在搜索相同的案例。如果您的搜索字符串全部为大写字母且标签不是,则它们将不匹配。

  2. 有一个((elem) => { func })方法,如果一个或多个迭代元素符合某些条件,则返回true:这是我们想要看到的任何关键字匹配的东西。

  3. 您希望按空格字符进一步拆分所有代码,以便视频'将返回所有带有'视频'或者,您可以将每个单词作为单独的标记(例如[" Streaming"," Video"])

  4. 这就是您的转换功能将这些建议考虑在内的原因:

    
    
    .some
    
    
    

答案 1 :(得分:0)

现在我明白了。您想传递一组值,如果任何标记属性包含任何值,则返回该对象,所以:



var array = [{"website": "www.aaa.aaa","score": 90,"tags": [ "Video Online"]},
  {"website": "www.bbb.bbb","score": 90,"tags": ["Streaming Video"]},
  {"website": "www.ccc.ccc","score": 90,"tags": ["Video"]}];


function transform(val, args) {
    if(typeof args[0] === 'undefined') {
      return val;
    }

    // Get the members of val whose tags property has
    // any of the values in args
    return val.filter(function(el) {

       // Returns true for the first match, otherwise false
       return args.some(function(s){return el.tags.indexOf(s) != -1});
    });
}

document.write(JSON.stringify(transform(array, ['Video','Video Online'])));




或者如果你想使用箭头功能:

function transform(val, args) {
    if(typeof args[0] !== 'undefined')
        return val.filter(el => args.some(s => el.tags.indexOf(s) != -1));
}