.filter()数组使用另一个数组的元素

时间:2011-09-08 20:15:09

标签: javascript arrays filter

我有一系列人的名字以及他们的语言知识。我想要做的是将过滤器传递到语言列并过滤掉任何不匹配的结果。

这是示例数组

   var myArray = [["Steppen", "Spanish Polish"],
                  ["Wolf", "Spanish Polish Tagalog"],
                  ["Amanda", "Spanish"],
                  ["Ada", "Polish"],
                  ["Rhonda", "Spanish Tagalog"]];

就传入过滤器而言,它可以是一种语言,也可以是多种语言。即使过滤器中的一种语言匹配 - 也应该返回结果。因此,例如,“塔加拉族语”的过滤器应该返回 - Wolf和Rhonda。 “西班牙语波兰语”的过滤器应该返回所有人 - 可以是西班牙语或波兰语的匹配。

我编写了过滤器功能,但由于某种原因它被卡住了,当我通过过滤器“Tagalog”时,它只迭代到数组中的第二个单元格(西班牙语波兰语塔加拉族语)并重复多次而不是前进。 / p>

我做错了什么,我应该以不同的方式迭代吗?

 var userPassedFilter = new Array();
 userPassedFilter[0] = "Tagalog";

 newArray = consolidatedFilters(myArray, userPassedFilter);
 console.log(newArray);

 function consolidatedFilters(passedArray, passedFilter)
 {
 var filteredArray = passedArray.filter(    
    function(el)
    {
        for (var i = 0; i < passedArray.length; i++)
         {
            console.log("i is " + i);
             for (var j in passedFilter)
            {
                console.log("Passed Filter j " + passedFilter[j]);
                console.log("Passed Array  i " + passedArray[i][1]);        
                console.log("String Search " + passedArray[i][1].search(passedFilter[j]));

                if (passedArray[i][1].search(passedFilter[j]) != -1)
                {
                    return true;
                }
            }           
        }
         return false;
    }
 );     
 return filteredArray;
 }

5 个答案:

答案 0 :(得分:13)

对我而言,似乎你让它变得有点过于复杂。

  1. 迭代三次(filterfor循环,for in循环)。
  2. 对数组使用for in循环。
  3. 同时使用new Array[...]
  4. 我稍微更新了一下,看起来这就是你想要的:http://jsfiddle.net/pimvdb/RQ6an/

    var myArray = [["Steppen", "Spanish Polish"],
                  ["Wolf", "Spanish Polish Tagalog"],
                  ["Amanda", "Spanish"],
                  ["Ada", "Polish"],
                  ["Rhonda", "Spanish Tagalog"]];
    
    var userPassedFilter = ["Tagalog"];
    
    newArray = consolidatedFilters(myArray, userPassedFilter);
    console.log(newArray);
    
    function consolidatedFilters(passedArray, passedFilter) {
        var filteredArray = passedArray.filter(
        function(el) { // executed for each person
            for (var i = 0; i < passedFilter.length; i++) { // iterate over filter
                if (el[1].indexOf(passedFilter[i]) != -1) {
                    return true; // if this person knows this language
                }
            }
            return false;
        }
        );     
        return filteredArray;
    }
    

答案 1 :(得分:5)

这是ES6方式的最终解决方案: 无需在另一个线程中再次搜索相同的查询。

  

var array1 = ['a', 'b', 'c', 'd', 'e'];
var array2 = ['b', 'd', 'f'];

array1 = array1.filter(function(item) {
  return !array2.includes(item); 
})
console.log(array1); // [ 'a', 'c', 'e' ]
console.log(array2); // [ 'b', 'd', 'f' ]

答案 2 :(得分:3)

这是一个更通用的版本,它删除了过滤器数组中的所有元素

function destroyer(arr) {
  // Remove all the values
  var passedArray = arr;
  var passedFilter = Array.prototype.slice.call(arguments, 1);

  var newArray = passedArray.filter(function(x){
    if(passedFilter.indexOf(x) !== -1){
      return false;
    }
    return true;
  });

  return newArray;
}


destroyer([1, 2, 3, 1, 2, 3], 3, 2);
//prints [1,1]

答案 3 :(得分:2)

我是javascript的新手,这是我能够使用另一个对我有意义的数组过滤数组的唯一方法:

function filterThisByThis(arr) {
var numArgs = arguments.length; 
var newArr = [];
for (var i = 1; i < numArgs; i ++) {
newArr.push(arguments[i]); 
} // makes a new array from all arguments parsed to fuction minus the orginal array 
arr = arr.filter(function(val) {
  for (var j = 0; j < newArr.length; j++) {
   if (val == newArr[j]) {
      return false;}
  }
  return true;
  }); // uses the filter function to iterate over the orginal array taking out all values which occur in the new array 
return arr;
}  
filterThisByThis([1, 2, 3, 4, 1, 2, 3, 4], 1, 3);
// prints [2, 4, 2, 4]

答案 4 :(得分:1)

@millerjay回复的另一个答案

function destroyer(arr) {
    var array = arr;
    var filterArray = Array.from(arguments).slice(1);
    var filtered = arr.filter(function(val){
        return filterArray.indexOf(val) === -1;
    });
    return filtered;
}

destroyer([1, 2, 3, 1, 2, 3], 3, 2);
//prints [1,1]