2011-09-08 108 views
4

我有一組人的姓名以及他們的語言知識。我想要做的是將過濾器傳遞到語言欄並過濾掉任何不匹配的結果。.filter()使用另一個數組元素的數組

這是樣本陣列

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

至於傳遞過濾器,它可以是一種語言的或者許多。即使過濾器的一種語言匹配 - 也應返回結果。例如,「他加祿語」的過濾器應該返回 - 沃爾夫和朗達。 「西班牙波蘭」的過濾器應該會返回所有人 - 這裏有西班牙語或波蘭語的比賽。

我寫過濾器的功能,但由於某種原因它卡住了,當我通過過濾器「他加祿」,它只迭代到數組中的第二個單元格(西班牙波蘭語他加祿語),並重復自己多次而不是前進。

我在做什麼錯,我應該以不同的方式迭代嗎?

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; 
} 
+0

你應該看看使用jQuery.each()http://api.jquery.com/jQuery.each/ –

+0

你使用jQuery的'.filter'或本地數組的'.filter'?它看起來像'passedArray'是你描述的數組,它不是一個jQuery對象。 – pimvdb

+0

我正在使用jQuery的.filter(函數)返回基於傳遞過濾器的數組。 passedArray只是我上面描述的示例數組。 – firedrawndagger

回答

13

對我來說,好像你讓它有點複雜。

  1. 迭代三次(filterfor環,for in循環)。
  2. 對數組使用for in循環。
  3. 使用new Array[...]

我更新了一下,它看起來像這就是你想要的: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; 
} 
+0

儘管我同意這個解決方案,但是如果我沒有錯,這看起來像O(n^2)。 http://stackoverflow.com/questions/26446055/run-time-of-nested-loops 有沒有其他有效的方法?感謝 – agpt

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] 
+0

看起來你也發現這篇文章,同時在Free Code Camp「Seek and Destroy」挑戰期間四處搜索。我一直在努力解決這個特殊的挑戰,這裏的輸入幫助我理解了一些js邏輯。 –

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] 
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] 
相關問題